java - java多线程是否可以优化多文件写入

标签 java multithreading performance time filewriter

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

ID Data ...4000+columns
001 dsa
002 Data
… …
17201297 asdfghjkl

我希望根据 ID 对文件进行分块,以便更快地检索数据,如下所示:

mylocation/0/0/1/data.json
mylocation/0/0/2/data.json
.....
mylocation/1/7/2/0/1/2/9/7/data.json

我的代码工作正常,但无论我使用什么编写器来关闭循环结束,它至少需要 159,206 毫秒才能完成 0.001% 的文件创建。

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

我当前的代码是:

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();
}

最佳答案

这实际上取决于您的存储空间。 磁盘确实喜欢顺序写入,因此多线程可能会对其性能产生不良影响。然而,SSD 可能会受益于多线程写入。

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

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

关于java - java多线程是否可以优化多文件写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59457951/

相关文章:

Java 到 JSON 转换 : JSTL vs Methodical (Jackson/Gson)

Java锁: Hand over hand locking through list

performance - 删除大量数据后,Cassandra 查找查询速度很慢

php - in_array() 性能优化

java - 如何全局配置jackson with spring?

java - 如何获得独立点击

Java SELECT 查询 您的 SQL 语法有错误

java - JVM 和 Java Linux 进程

python - 如何在多线程 python 应用程序中创建全局错误处理程序

c - 什么是最小化 RAM 消耗的良好实现实践