gpt4 book ai didi

java - 在 Java 中读取 MB 大文件的最佳方法

转载 作者:行者123 更新时间:2023-12-03 21:30:35 29 4
gpt4 key购买 nike

我正在浏览帖子,它说使用 BufferedReader 或 MappedByteBuffer。我决定自己用 291.0 MB 的文件进行测试,但仍然无法决定

    BufferedReader reader = new BufferedReader(new FileReader("/Users/rachana/part-00000"));
String line = null;
while((line = reader.readLine())!=null) {
System.out.println(line);
}


~~~~~~ Heap utilization in MB ~~~~~~
Start Date 21:10:20
End Date 21:17:48
Time used 448 second
7.50 min
Used Memory In MB:28
Free Memory:81
Total Memory:109
Max Memory:1820

使用 MappedByteBuffer

RandomAccessFile aFile = new RandomAccessFile
("/Users/rachana/part-00000", "r");
FileChannel inChannel = aFile.getChannel();
MappedByteBuffer buffer = inChannel.map(FileChannel.MapMode.READ_ONLY, 0, inChannel.size());
buffer.load();
for (int i = 0; i < buffer.limit(); i++)
{
System.out.print((char) buffer.get());
}
buffer.clear(); // do something with the data and clear/compact it.
inChannel.close();
aFile.close();



~~~~~~ Heap utilization in MB ~~~~~~
Start Date 21:20:40
End Date 21:33:52
Time used 792 sec / 13.2 min
Used Memory In MB:4
Free Memory:104
Total Memory:109
Max Memory:1820

它清楚地指出 MappedByteBuffer 使用更少的内存但更多的时间,而 BufferedReader 使用更多的内存但时间更少。

我正在尝试找到使用 MappedByteBuffer 读取行的平衡方式。

任何建议都会有帮助

最佳答案

你正在做的最慢的部分是打印到屏幕。我建议你不要那样做,你会觉得 MemoryMapped 文件快得多(如果你不是一次打印一个字符到控制台)

注意:除非您使用的是 IS-8859-1 或 US-ASCII 编码文本文件,否则这两者不可互换。 BufferedReader 用于文本,内存映射文件用于二进制。

顺便说一句,如果您忽略执行的 GC 次数,那么查看使用的内存是没有意义的。如果你只关心开始和结束时使用的内存,你应该在测量之前用 System.gc() 做一个完整的 GC,我希望你会在这两种情况下看到一个小的随机差异(可能是负数)。

如果您考虑分配,则需要更大的伊甸园大小,例如2 GB 开始为空(在完整 GC 之后),或者您可以使用分析器来测量分配。在第一种情况下,字符串将分配最多的数据,而在第二种情况下,写入控制台将创建最多的数据。

关于java - 在 Java 中读取 MB 大文件的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24837232/

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