SQLite耗尽内存而不抛出异常

时间:2017-01-16 13:16:40

标签: c# sqlite memory

我有一个简单的C#应用​​程序将CSV文件读入SQLite数据库。

当读取数据时(此时数据库文件大约为5GB),我在包含所有数据的单个表上创建索引。

CREATE INDEX index_name ON table_name(col_a, col_b ASC)

然后,我可以在Visual Studio调试输出窗口中看到以下错误消息:

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

在创建索引的几秒钟内,错误消息会重复几百次。

The SQLite documentation说以下内容:

  

(6154)SQLITE_IOERR_MMAP
  SQLITE_IOERR_MMAP错误代码是   SQLITE_IOERR的扩展错误代码,表示其中的I / O错误   sqlite3_io_methods对象上的xFetch或xUnfetch方法   尝试将部分数据库文件映射或取消映射到进程中   地址空间。

我的硬盘仍然剩下大约30GB,这个过程在运行命令时只使用了大约300MB的内存,并且计算机上至少有30%的可用物理内存,所以我不知道为什么它发生了。

不会抛出任何异常,它只会打印到调试控制台。索引似乎在数据库中正确创建。这是否意味着错误消息不是有害的?我可以放心地忽略它吗?如果出现问题,我可以让它抛出一个实际的异常吗?我发现我的数据库可能已经腐败,这有点可怕。

1 个答案:

答案 0 :(得分:0)

MMAP只是一种优化。如果失败,SQLite将回归使用正常FileRead()次呼叫。

您的计算机上没有足够的地址空间来映射5 GB文件。