首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是java多线程可以优化多个文件的写入。

问是java多线程可以优化多个文件的写入。
EN

Stack Overflow用户
提问于 2019-12-23 15:45:07
回答 1查看 192关注 0票数 0

我有一个400+ GB文件,如:

代码语言:javascript
复制
ID Data ...4000+columns
001 dsa
002 Data
… …
17201297 asdfghjkl

我希望按照ID对文件进行分块,以获得更快的数据检索,如下所示:

代码语言:javascript
复制
mylocation/0/0/1/data.json
mylocation/0/0/2/data.json
.....
mylocation/1/7/2/0/1/2/9/7/data.json

我的代码工作得很好,但是不管我用什么编写器来关闭循环结束,要完成0.001%的文件创建,至少需要159,206毫秒。

在这种情况下,多线程可以作为降低时间复杂度的一种选择(比如一次写入100或1k文件)吗?

我的当前代码是:

代码语言:javascript
复制
int percent = 0;
File file = new File(fileLocation + fileName);
FileReader fileReader = new FileReader(file); // to read input file

BufferedReader bufReader = new BufferedReader(fileReader);
BufferedWriter fw = null;
LinkedHashMap<String, BufferedWriter> fileMap = new LinkedHashMap<>();
int dataCounter = 0;

while ((theline = bufReader.readLine()) != null) {
    String generatedFilename = generatedFile + chrNo + "//" + directory + "gnomeV3.json";
    Path generatedJsonFilePath = Paths.get(generatedFilename);
    if (!Files.exists(generatedJsonFilePath)) {// create directory
        Files.createDirectories(generatedJsonFilePath.getParent());
        files.createFile(generatedJsonFilePath);
    }
    String jsonData = DBFileMaker(chrNo, theline, pos);
    if (fileMap.containsKey(generatedFilename)) {
        fw = fileMap.get(generatedFilename);
        fw.write(jsonData);
    } else {
        fw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(generatedFilename)));
        fw.write(jsonData);
        fileMap.put(generatedFilename, fw);
    }
    if (dataCounter == 172 * percent) {// As I know my number of rows
        long millisec = stopwatch.elapsed(TimeUnit.MILLISECONDS);
        System.out.println("Upto: " + pos + " as " + (Double) (0.001 * percent)
        + "% completion successful." + " took: " + millisec + " miliseconds");
        percent++;
    }
    dataCounter++;
}
for (BufferedWriter generatedFiles : fileMap.values()) {
    generatedFiles.close();
}
EN

回答 1

Stack Overflow用户

发布于 2019-12-23 15:51:40

这取决于你的储藏室。磁盘非常喜欢顺序写入,因此多线程可能会对它们的性能产生不良影响。但是,多线程写入可能会使SSD受益。

您应该做的是将代码分离到两个线程,其中一个线程创建要写入磁盘的数据缓冲区,而第二个线程只写入数据。这样,您的磁盘将始终保持忙碌,而不是等待更多的数据被生成。

或者使用单个线程生成要写入的缓冲区,但使用java nio来异步写入数据,同时继续生成下一个缓冲区。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59457951

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档