我试图转换comp3和EBCIDIC字符在我的java代码,但我运行到内存不足的异常,因为处理的数据量是巨大的约5 gb。我的代码目前如下:
byte[] data = Files.readAllBytes(path);
这会导致内存不足的异常,我可以理解,但我不能使用文件扫描仪,因为文件中的数据不会被分成几行。
谁能告诉我如何处理这件事的正确方向?
注意:文件可能包含不同长度的记录,因此不可能根据记录长度拆分它。
正如Bill所说,你可以(应该)要求将数据转换为主机上的显示字符,如果你说英语,你可以进行ascii传输。
还有你如何决定comp-3字段从哪里开始??
你不需要把整个文件读入内存,你仍然可以读文件块,这个方法将填充一个字节数组:
protected final int readBuffer(InputStream in, final byte[] buf)
throws IOException {
int total = 0;
int num = in.read(buf, total, buf.length);
while (num >= 0 && total + num < buf.length) {
total += num;
num = in.read(buf, total, buf.length - total);
}
return num;
}
如果所有记录是相同的长度,创建一个记录长度的数组,上面的方法每次读取一条记录。
最后JRecord项目有类来读取固定长度的文件等。它可以做comp3转换。注:我是JRecord的作者。
我遇到内存不足的异常,因为处理的数据量是巨大的,大约5gb。
你一次只需要读一条记录。
我的代码目前如下:
byte[] data = Files.readAllBytes(path);
这导致内存不足的异常,我可以理解
我也是。
但是我不能使用文件扫描仪,因为文件中的数据不会被分成几行。
你的意思是你不能使用Scanner
类?这不是一次读取记录的唯一方法。
我将不得不拆分它基于属性record_id在一个特定的位置(说在每条记录的开始),这将告诉我记录长度
因此读取该属性,必要时解码它,并根据从该属性派生的记录长度读取记录的其余部分。一次一个。
我建议你注意DataInputStream
,特别是readFully()
的方法。您还需要一个Java COMP-3库。有几种可用的。其余的大部分可以通过内置的EBCDIC字符集解码器完成。