我正在尝试在我的java代码中转换comp3和EBCIDIC字符,但我遇到了内存不足异常,因为处理的数据量大约为5 GB。我的代码目前如下:
byte[] data = Files.readAllBytes(path);
这导致内存不足异常,我可以理解,但我不能使用文件扫描程序,因为文件中的数据不会被分成行。
任何人都可以指出我如何处理这个
的正确方向注意:文件可能包含不同长度的记录,因此根据不可能的记录长度接缝将其拆分。
答案 0 :(得分:0)
正如比尔所说,您可以(应该)要求将数据转换为在大型机上显示字符,如果说英语,您可以进行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项目具有读取固定长度文件等的类。它可以进行comp-3转换。注意:我是JRecord的作者。
答案 1 :(得分:0)
由于处理的数据量大约为5 GB,我遇到内存不足异常。
您只需要一次读取一条记录。
我的代码目前如下:
byte[] data = Files.readAllBytes(path);
这导致内存不足异常,我能理解
我也是。
但我也不能使用文件扫描程序,因为文件中的数据不会被分成行。
你的意思是你不能使用Scanner
课程?这不是一次读取记录的唯一方法。
在任何情况下,并非所有文件都有记录分隔符。有些具有固定长度的记录,有些在每条记录的开头有长度字,有些在每条记录的开头都有记录类型属性,或者至少在记录的固定部分都有记录类型属性。
我必须根据特定位置(比如每条记录的开头)的属性record_id将其拆分,这将告诉我记录长度
因此,读取该属性,必要时对其进行解码,并根据从属性派生的记录长度读取记录的其余部分。一次一个。
我引导您注意DataInputStream
的方法,特别是readFully()
。您还需要一个Java COMP-3库。有几个可用。其余大部分都可以通过内置的EBCDIC字符集解码器来完成。