将大量数据写入文本文件可能是一项耗时的任务,并实现最佳速度至关重要。本文探讨了使用文本文件格式在 Java 中写入大量数据的最快技术。
当使用 BufferedWriter 将数据写入文本文件时,默认缓冲区大小可能会导致性能下降。这是因为 BufferedWriter 会定期将内部缓冲区刷新到底层文件流,从而引入额外的开销。
为了优化写入速度,可以考虑消除 BufferedWriter 并直接使用 FileWriter。这种方法消除了缓冲区刷新开销,并允许系统直接写入磁盘的缓存内存。
根据经验,删除 BufferedWriter 可以显着提高写入速度。使用 400 万个字符串 (175MB) 进行的测试表明,现代系统上的写入时间从 40 秒减少到大约 4-5 秒。
识别瓶颈写入过程中,必须将检索记录所花费的时间与文件写入所消耗的时间分开。通过对每个任务进行单独的测试,您可以查明可以改进性能的领域。
以下 Java 代码提供了使用直接和缓冲文件写入的替代实现,允许比较不同缓冲区大小:
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() sh
此实现揭示了使用直接文件写入的速度优势,并深入了解不同缓冲区大小对写入的影响性能。
通过优化文件写入过程并消除不必要的开销,Java 允许您高效地将大量数据写入文本文件。直接文件写入或使用大缓冲区的 BufferedWriter 可以显着提高写入速度,使您能够以惊人的速度处理海量数据集。
以上是Java写入海量数据到文本文件时如何优化写入速度?的详细内容。更多信息请关注PHP中文网其他相关文章!