以下のフィールドを持つ〜5M行の巨大なcsvファイルデータベースがあります
start_ip,end_ip,country,city,lat,long
start_ip をキー、rest を値として使用して、これらを LevelDB に格納しています。
キーのレコードを取得するにはどうすればよいですか?
( ip_key > start_ip and ip_key < end_ip )
代替ソリューション。
以下のフィールドを持つ〜5M行の巨大なcsvファイルデータベースがあります
start_ip,end_ip,country,city,lat,long
start_ip をキー、rest を値として使用して、これらを LevelDB に格納しています。
キーのレコードを取得するにはどうすればよいですか?
( ip_key > start_ip and ip_key < end_ip )
代替ソリューション。
キーは IP のハッシュ値であり、ハッシュは 64 ビットの「符号なし」整数であると想定していますが、そうでない場合は、適切なキーを考慮して以下のコードを変更してください。
void MyClass::ReadRecordRange(const uint64 startRange, const uint64 endRange)
{
// Get the start slice and the end slice
leveldb::Slice startSlice(static_cast<const char*>(static_cast<const void*>(&startRange)), sizeof(startRange));
leveldb::Slice endSlice(static_cast<const char*>(static_cast<const void*>(&endRange)), sizeof(endRange));
// Get a database iterator
shared_ptr<leveldb::Iterator> dbIter(_database->NewIterator(leveldb::ReadOptions()));
// Possible optimization suggested by Google engineers
// for critical loops. Reduces memory thrash.
for(dbIter->Seek(startSlice); dbIter->Valid() && _options.comparator->Compare(dbIter->key(), endSlice)<=0); dbIter->Next())
{
// get the key
dbIter->key().data();
// get the value
dbIter->value().data();
// TODO do whatever you need to do with the key/value you read
}
}
データベースインスタンスを開いたものと_options同じであることに注意してください。leveldb::Optionsオプションで指定されたコンパレータを使用して、レコードを読み取る順序がデータベース内の順序と同じになるようにします。
boost または tr1 を使用していない場合は、 に似た別のものを使用するか、自分shared_ptrで を削除することができleveldb::Iteratorます。イテレータを削除しないと、メモリ リークが発生し、デバッグ モードでアサートが発生します。