我想读取一个包含 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 检查。