我有一个简单的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%的可用物理内存,所以我不知道为什么它发生了。
不会抛出任何异常,它只会打印到调试控制台。索引似乎在数据库中正确创建。这是否意味着错误消息不是有害的?我可以放心地忽略它吗?如果出现问题,我可以让它抛出一个实际的异常吗?我发现我的数据库可能已经腐败,这有点可怕。
答案 0 :(得分:0)
MMAP只是一种优化。如果失败,SQLite将回归使用正常FileRead()
次呼叫。
您的计算机上没有足够的地址空间来映射5 GB文件。