gpt4 book ai didi

java - 使用缓冲区读取二进制文件

转载 作者:行者123 更新时间:2023-11-30 02:13:05 25 4
gpt4 key购买 nike

我正在尝试读取包含 100.000 个不同对象的二进制文件。
使用 BufferedReader 缓冲具有相同内容的简单文本文件仅需 2MB。

但是读取二进制文件最多需要 700 MB,如果增加要读取的对象数量,我会收到 OutOfMemory 错误。

那么如何在不使内存饱和的情况下读取文件并一一获取对象呢?

这是我正在测试的代码:

public static void main(String[] args) throws Exception {
int i = 0;
String path = "data/file.bin";
InputStream file = new FileInputStream(path);
InputStream buffer = new BufferedInputStream(file);
ObjectInputStream in = new ObjectInputStream(buffer);
Object obj = null;
while( ( obj = in.readObject() ) != null && i < 100000 ){
String str = obj.toString();
System.out.println( str );
i++;
}

timeTkken();
}

// Function to get the amount of time/memory used by the script
private static final long startTime = System.currentTimeMillis();
private static final long MEGABYTE = 1024L * 1024L;
public static void timeTkken(){
Runtime runtime = Runtime.getRuntime();
long endTime = System.currentTimeMillis();
long memory = runtime.totalMemory() - runtime.freeMemory();
long megabytes = memory / MEGABYTE;
System.out.println("It took " + megabytes + "mb in " + ( (endTime - startTime) /1000 ) + "s ("+ memory + (" bytes in ") + (endTime - startTime) + " ms)");

}

最佳答案

据我所知,ObjectInputStream 将所有对象保留在缓存中,直到流关闭。因此,如果您的二进制文件约为 207 MB,那么 java 堆中的实际对象可能很容易占用几 GB RAM,并且无法进行垃圾收集。这里出现了一个问题:您是否需要将所有数据同时保存在 RAM 中?

如果没有(您想读取一个对象,以某种方式处理它,丢弃它并移动到下一个对象),我建议使用DataInputStream而不是ObjectInputStream。我不知道这种方法是否适用于您的情况,因为我不知道您的数据的结构。如果您的数据是相同结构的记录集合,您可以执行以下操作:

    public class MyObject {
private int age;
private String name;

public MyObject(int age, String name) {
this.age = age;
this.name = name;
}
}

DataInputStream in = new DataInputStream(new BufferedInputStream(new FileInputStream("path.to.file")));
// suppose that we store the total number of objects in the first 4 bytes of file
int nObjects = in.readInt();
for (int i = 0; i < nObjects; i++) {
MyObject obj = new MyObject(in.readInt(), in.readUTF());
// do some stuff with obj
}

关于java - 使用缓冲区读取二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49533217/

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