次のように事前定義された順序で繰り返される M 個の連続する倍数を含む大きな bin ファイルを読みたいと思います。
A0, A1, A2... AN, B0, B1, B2... BN... (M times)
ファイルが大きすぎてメインメモリに収まらない可能性があるため、ファイルを一度に読み取ることはできません。したがって、ファイルをスライス (チャネル) に分割するために、クラスRandomAccessFile
とを使用します。MappedByteBuffer
各連続数 (N) はわかっているが、連続数の合計 (M) がわからない場合、次のケースに関するベスト プラクティスは何かを知りたいです。
1) データを保存する最良の方法は何ですか? List<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 チェック。