私は10万以上の行を含むデータファイルを持っています。各行には2つのフィールドがあり、キーと値はコンマで区切られています。私はこのファイルからキーで値を照会したい。それをマップにロードすることは、あまりにも多くのメモリを消費するため(コードは組み込みデバイス上で実行されるため)、DBを関与させたくないということは疑問です。前処理された大きなテキストファイルの行を検索
public long findKeyOffset(RandomAccessFile raf, String key)
throws IOException {
int blockSize = 8192;
long fileSize = raf.length();
long min = 0;
long max = (long) fileSize/blockSize;
long mid;
String line;
while (max - min > 1) {
mid = min + (long) ((max - min)/2);
raf.seek(mid * blockSize);
if (mid > 0)
line = raf.readLine(); // probably a partial line
line = raf.readLine();
String[] parts = line.split(",");
if (key.compareTo(parts[0]) > 0) {
min = mid;
} else {
max = mid;
}
}
// find the right line
min = min * blockSize;
raf.seek(min);
if (min > 0)
line = raf.readLine();
while (true) {
min = raf.getFilePointer();
line = raf.readLine();
if (line == null)
break;
String[] parts = line.split(",");
if (line.compareTo(parts[0]) >= 0)
break;
}
raf.seek(min);
return min;
}
が、私はこれよりも良いソリューションがあると思います。私はこれまでやっていることは、すなわち、その後、前処理ファイルに以下のようにバイナリ検索を使用して、行を並べ替える、前処理に私のPC内のファイルです。誰か私に啓発を与えることができますか?
定数時間ソートアルゴリズムの使用はどうですか? – Prashant
* "マップにロードするのは、あまりにも多くのメモリを消費するので問題になりません[...]私がこれまで行ってきたことは、PCのファイルを前処理することです。つまり、行をソートし、 *デバイスにファイルコンテンツをソートするのに十分なメモリがある場合は、それをマップに保持するのに十分なメモリもあります。 –
@TimothyTruckle私は自分のPCでそれを並べ替え、それをデバイスにコピーします。 – jfly