0

我想读取一个包含 M 连续双数的大型 bin 文件,它们以预定义的顺序重复:

A0, A1, A2... AN, B0, B1, B2... BN... (M times)

我不允许一次读取文件,因为文件可能太大,无法容纳主内存。因此,我使用类RandomAccessFile并将MappedByteBuffer文件划分为切片(通道)。鉴于我知道每个连续的数字数量(N)但我不知道连续的总数(M),我想知道以下情况的最佳实践是什么:

1) 保存数据的最佳方法是什么?我使用 aList<List<Double>>因为我认为 Map 不提供灵活性(它会太慢)来解决这种情况?我对吗?

2)确定到达文件末尾并且算法应该停止的方法是什么?

这是我写的代码:

public void parseFile() throws IOException{

        RandomAccessFile raf = new RandomAccessFile(file, "r");
        long pos = raf.getFilePointer();
        while((pos = raf.getFilePointer()) != -1){
            parseDataSets(pos, 20);
        }

        raf.close();
    }

private void parseDataSets(long pos, long size)
            throws IOException {

        List<List<Double>> valuesSet = new ArrayList<List<Double>>();
        mbb = raf.getChannel().map(FileChannel.MapMode.READ_ONLY, pos,
                size * 8 * numberOfSignals);


            for (int i = 0; i < size; i++) {
                for (int j = 0; j < numberOfSignals; j++) {
                    if (valuesSet.get(j) == null)
                        valuesSet.set(j, new ArrayList<Double>());

                    if (j == 0)
                        valuesSet.get(j).add((double) mbb.getDouble());
                    else
                        valuesSet.get(j).add(mbb.getDouble());
                }
            }

    }

我认为方法中需要一个 while 循环parseDataSets来检查文件的结尾是否更早到达(如果最后一个切片包含少于 20 个连续)。

更新:每个连续的第一个数字很长,而不是双倍,因此parseDataSets方法中的 if-else 检查。

4

0 回答 0