java - 在文本文件 Java 中写入大量数据的最快方法

标签 java file resultset

我必须在 text[csv] 文件中写入大量数据。我使用 BufferedWriter 写入数据,写入 174 mb 数据大约需要 40 秒。这是 java 能提供的最快速度吗?

bufferedWriter = new BufferedWriter ( new FileWriter ( "fileName.csv" ) );

注意:这 40 秒还包括迭代和从结果集中获取记录的时间。 :) 。 174 mb 用于结果集中的 400000 行。

最佳答案

您可以尝试删除 BufferedWriter 并直接使用 FileWriter。在现代系统上,您很有可能只是在写入驱动器的缓存。

写入 175MB(400 万个字符串)需要 4 到 5 秒——这是在运行 Windows XP 的双核 2.4GHz 戴尔和 80GB、7200-RPM 日立磁盘上。

你能区分出记录检索的时间和文件写入的时间吗?

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;

public class FileWritingPerfTest {
    

private static final int ITERATIONS = 5;
private static final double MEG = (Math.pow(1024, 2));
private static final int RECORD_COUNT = 4000000;
private static final String RECORD = "Help I am trapped in a fortune cookie factory\n";
private static final int RECSIZE = RECORD.getBytes().length;

public static void main(String[] args) throws Exception {
    List<String> records = new ArrayList<String>(RECORD_COUNT);
    int size = 0;
    for (int i = 0; i < RECORD_COUNT; i++) {
        records.add(RECORD);
        size += RECSIZE;
    }
    System.out.println(records.size() + " 'records'");
    System.out.println(size / MEG + " MB");
    
    for (int i = 0; i < ITERATIONS; i++) {
        System.out.println("\nIteration " + i);
        
        writeRaw(records);
        writeBuffered(records, 8192);
        writeBuffered(records, (int) MEG);
        writeBuffered(records, 4 * (int) MEG);
    }
}

private static void writeRaw(List<String> records) throws IOException {
    File file = File.createTempFile("foo", ".txt");
    try {
        FileWriter writer = new FileWriter(file);
        System.out.print("Writing raw... ");
        write(records, writer);
    } finally {
        // comment this out if you want to inspect the files afterward
        file.delete();
    }
}

private static void writeBuffered(List<String> records, int bufSize) throws IOException {
    File file = File.createTempFile("foo", ".txt");
    try {
        FileWriter writer = new FileWriter(file);
        BufferedWriter bufferedWriter = new BufferedWriter(writer, bufSize);
    
        System.out.print("Writing buffered (buffer size: " + bufSize + ")... ");
        write(records, bufferedWriter);
    } finally {
        // comment this out if you want to inspect the files afterward
        file.delete();
    }
}

private static void write(List<String> records, Writer writer) throws IOException {
    long start = System.currentTimeMillis();
    for (String record: records) {
        writer.write(record);
    }
    // writer.flush(); // close() should take care of this
    writer.close(); 
    long end = System.currentTimeMillis();
    System.out.println((end - start) / 1000f + " seconds");
}
}

关于java - 在文本文件 Java 中写入大量数据的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1062113/

相关文章:

java - Apache 希罗 : not able to access secured URL although logged in successfully

java - 使用另一个数组的选择元素创建一个新数组

linux - 从多个文件复制数据并添加到不同的文件

java - 在 Java 中通过 HTTP 列出 apache 服务器上的文件/子文件夹

java - 在 Java 程序中开始结果集之前获取 SQL 错误 1078

java - sql server 存储过程,无法在 java 中返回结果集

java - 无法连接到 SMTP 主机 : outlook. office365.com,端口 : 587; nested exception is: java.net.SocketException:权限被拒绝:连接

java - 如何有一个带有 backgroundTint 和圆角半径的按钮

python - 如何获取调用者脚本名称

php - 如何使用 store_result() 获取数据?