2017-01-16 9 views
0

私は単純なC#アプリケーションでCSVファイルをSQLiteデータベースに読み込んでいます。例外をスローせずにSQLiteがメモリ不足になる

データが読み込まれると(この時点でデータベースファイルは約5GBです)、すべてのデータを含む単一のテーブルにインデックスを作成します。インデックスの作成中に

SQLite error (6154): os_win.c:41445: (8) winMapfile2() - Not enough storage is available to process this command. 

エラーメッセージが数秒の間、それ自体が百倍のカップルを繰り返し:

CREATE INDEX index_name ON table_name(col_a, col_b ASC) 

は、私は、Visual Studioのデバッグ出力ウィンドウに次のエラーメッセージを見ることができます。 sqlite3_io_methodsオブジェクトの xFetch又はxUnfetchメソッド内でI/Oエラーを示す

(6154)SQLITE_IOERR_MMAP
SQLITE_IOERR_MMAPエラーコードがSQLITE_IOERRため 拡張エラーコードである:

The SQLite documentationは、以下を言います データベースファイルの一部をプロセス のアドレス空間にマップまたはマップ解除しようとしています。

私のハードドライブはまだ30ギガバイトについてのコマンドを実行している間、プロセスは専用メモリの300メガバイト程度使用され、残っている、とコンピュータの少なくとも30%使用可能な物理メモリがあるので、私はなぜわからないんだけどそれはまったく起こります。

例外はスローされません。デバッグコンソールにのみ出力されます。インデックスはデータベース内で正しく作成されているようです。これは、エラーメッセージが有害ではないことを意味しますか?私はそれを無視してもいいですか?何か問題が生じた場合に実際の例外をスローすることはできますか?私のデータベースはかもしれないが壊れているのは怖いと思う。

答えて

0

MMAPは単なる最適化です。失敗した場合、SQLiteは通常のFileRead()呼び出しを使用します。

5 GBのファイルをマップするのに十分なアドレススペースがないと、おそらくマシン上で問題ありません。

+0

偉大な、ちょうど私が必要とした情報。ありがとうございました! –