0

我正在尝试在我的 java 代码中转换 comp3 和 EBCIDIC 字符,但我遇到内存不足异常,因为处理的数据量约为 5 GB。我的代码目前如下:

byte[] data = Files.readAllBytes(path);

这导致我可以理解的内存不足异常,但我也不能使用文件扫描仪,因为文件中的数据不会被拆分成行。

谁能指出我如何处理这个问题的正确方向

注意:文件可能包含不同长度的记录,因此不可能根据记录长度接缝对其进行拆分。

4

2 回答 2

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 的作者。

于 2015-10-15T23:13:39.300 回答
0

我遇到了内存不足异常,因为处理的数据量很大,大约 5 GB。

您一次只需要读取一条记录。

我的代码目前如下:

byte[] data = Files.readAllBytes(path);

这导致我可以理解的内存不足异常

我也是。

但我也不能使用文件扫描仪,因为文件中的数据不会被分割成行。

你的意思是你不能使用这个Scanner类?这不是一次读取记录的唯一方法。

无论如何,并非所有文件都有记录分隔符。有些有固定长度的记录,有些在每条记录的开头有长度词,有些在每条记录的开头有记录类型属性,或者在这两种情况下至少在记录的固定部分。

我将不得不根据特定位置的属性 record_id 拆分它(比如在每条记录的开头),这将告诉我记录长度

因此,读取该属性,必要时对其进行解码,然后根据您从该属性派生的记录长度读取记录的其余部分。一次一个。

我把你的注意力引向了方法DataInputStream,尤其是readFully()。您还需要一个 Java COMP-3 库。有几种可用。其余大部分可以通过内置的 EBCDIC 字符集解码器完成。

于 2015-10-15T23:30:43.453 回答