gpt4 book ai didi

java - Liferay 并发文件条目上传

转载 作者:行者123 更新时间:2023-12-02 13:30:39 24 4
gpt4 key购买 nike

问题陈述:

在liferay中,我必须将zip文件导入到liferay cms中的某个文件夹中,到目前为止,我已经实现了zip文件的串行解压缩,创建了它的文件夹,然后创建了它的文件。这里的问题是整个过程需要很多时间。所以我必须使用并行方法来创建文件夹和创建文件。

我的解决方案:

我使用了 java java.util.concurrent.ExecutorService 来创建 Executors.newFixedThreadPool(NTHREDS),其中 NTHREDS 是要并行运行的线程数(比如说 5)

  1. 我从 zip 中读取了所有文件夹路径并放置了 zip 列表将文件夹路径的整体(文件)作为 HashMap 中的键
  2. 遍历 map 中的所有键并依次创建文件夹
  3. 现在从映射中遍历 zip 条目(文件)列表并传递给线程 worker ,每个 worker 一个文件,然后这些 worker 被发送到ExecutorService 执行

到目前为止,我没有发现整个过程的时间有任何显着减少,我是否朝着正确的方向前进? liferay支持并发文件添加吗?我究竟做错了什么?

我将非常感谢您在这方面的任何帮助

下面是我的代码

imports 
...
...
public class TestImportZip {

private static final int NTHREDS = 5;
ExecutorService executor = null;
...
...
....
Map<String,Folder> folders = new HashMap<String,Folder>();
File zipsFile = null;

public TestImportZip(............,File zipFile, .){

.
.
this.zipsFile = zipFile;
this.executor = Executors.newFixedThreadPool(NTHREDS);
}

// From here the process starts
public void importZip() {

Map<String,List<ZipEntry>> foldersMap = new HashMap<String, List<ZipEntry>>();

try (ZipFile zipFile = new ZipFile(zipsFile)) {
zipFile.stream().forEach(entry -> {

String entryName = entry.getName();
if(entryName.contains("/")) {

String key = entryName.substring(0, entryName.lastIndexOf("/"));

List<ZipEntry> zipEntries = foldersMap.get(key);

if(zipEntries == null){
zipEntries = new ArrayList<>();
}

zipEntries.add(entry);

foldersMap.put(key,zipEntries);

}
});

createFolders(foldersMap.keySet());

createFiles(foldersMap);

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

private void createFolders(Set<String> folderPathSets) {

// create folder and put the folder in map
.
.
.

folders.put(folderPath,folder);
}

private void createFiles(Map<String, List<ZipEntry>> foldersMap) {
.
.
.
//Traverse all the files from all the list in map and send them to worker
createFileWorker(folderPath,zipEntry);

}

private void createFileWorker(String folderPath,ZipEntry zipEntry) {

CreateEntriesWorker cfw = new CreateEntriesWorker(folderPath, zipEntry);
executor.execute(cfw);
}

class CreateEntriesWorker implements Runnable{

Folder folder = null;
ZipEntry entryToCreate = null;


public CreateEntriesWorker(String folderPath, ZipEntry zipEntry){

this.entryToCreate = zipEntry;
// get folder from already created folder map
this.folder = folders.get(folderPath);

}

public void run() {

if(this.folder != null) {
long startTime = System.currentTimeMillis();

try (ZipFile zipFile = new ZipFile(zipsFile)) {

InputStream inputStream = zipFile.getInputStream(entryToCreate);

try{

String name = entryToCreate.getName();
// created file entry here
}catch(Exception e){

}finally{

if(inputStream != null)
inputStream.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}

}

最佳答案

您的简化代码不包含我认识的任何 Liferay 引用。您提供的描述暗示您正在尝试优化某些代码,但您的尝试并未获得更好的性能。这通常表明您正在尝试优化问题的错误方面(或者已经相当优化)。

您需要确定操作的实际瓶颈,以便了解优化是否可行。有句俗话叫“过早优化是万恶之源”。这是什么意思?

我将在这里完全编造数字 - 不要引用我的话:它们是为了说明目的而自由发明的。假设您将 Zip 文件的内容添加到 Liferay 存储库的操作分配给以下百分比的操作资源:

  • 4% zip 文件解码/解压缩
  • 6% 文件 I/O 用于 zip 操作和临时文件
  • 10% 数据库操作用于存储文件
  • 60% 用于从 zip 文件中存储的 word、pdf、excel 和其他文件中仅提取文本,以便在全文索引中索引文档
  • 全文索引库用于整合索引的开销为 20%。

假设您正在优化 zip 文件解码/解压缩 - 您预计会有哪些总体改进?

虽然我的数字是编造的:如果您的优化没有任何结果,我建议反转它们,测量您需要优化的地方并追求那个地方(或者接受它并升级您的硬件,如果那个地方是)够不着)。

运行这些数字来了解 CPU、I/O、内存和其他潜在瓶颈。确定你的实际瓶颈#1,修复它,再次测量。您会看到 2 号瓶颈已得到提升。重复冲洗,直到满意为止

关于java - Liferay 并发文件条目上传,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43201355/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com