2016-04-30 5 views
-1

私は現在、数百万のデータポイントでかなり簡単な計算をする必要があると感じています。 (よく定義されたマルチギガバイトファイルから大量の文字列リストを作成し、そのリストをソートし、それを別のリスト、つまりスーパーセットと比較する)これは、私たちの大部分が、私がメモリ内にすべてを保持しようとすると、RAMの問題が発生する可能性があります。私はすぐに、システムのリソースを使い果たすのを避けるために、データをファイルに書き込む必要があるかもしれないことをすぐに認識しました。私はこれにSQLite3を使うことにしました。 (これはおそらくCSVにとっては多分です)かなり軽量ですが、ストレージの制限が安全に自分の要件を超えているようです。SQLiteの結果はインメモリのデータ構造を設定していますか?

私が抱えている問題は、結果セットの仕組みを正確に理解していることです。私が出会ったドキュメンテーションは、これについて少し曖昧に思えます。明らかに、SQLiteは、SELECT文が実行されるたびに、データベースに全く新しいテーブルを書き込んでいません。これは、完全なインメモリテーブル内の選択されたフィールドをすべて複製していることを意味するのでしょうか、または実際のデータではなくメモリ内に何らかのポインタを保持しているだけですか?一体何か?

問題のデータを並べ替えることができる必要があります。結果セットが実際にメモリ内のデータ構造である場合、単純に新しいテーブルの作成を作成し、それをORDER BYの助けを借りて作成するのは良い考えではありません。

答えて

1

SQLiteには結果セットがありません。カーソルには、現在の行のみにアクセスすることができ、逆方向に移動することはできません。

SQLiteはその場で結果を計算するため、一度に1つの行だけをメモリに格納する必要があります。

計算が可能な限り多くのデータをcacheに維持されるように、複数の行(すなわち、集合関数、または使用可能なインデックスなしソーティング)にアクセスする必要があり、その後、temporary databaseでディスクにこぼれました。

関連する問題