在我的C#程序中,我正在阅读大约350GB的压缩CSV文件,并将数据存储在SQLite v3数据库中。我正在使用NuGet中的System.Data.SQLite
。
我的数据库目前大约是147GB,我在尝试运行下一个INSERT查询时遇到错误:
(778)os_win.c:41557:(665)winWrite2(D:\ System.db) - 由于文件系统限制,无法完成请求的操作。
错误:第1行附近:磁盘I / O错误。"
驱动器为1.81TiB,无1.37TiB。卷是NTFS。 DB为146650432KiB。 ChkDsk报告一切正常,否则驱动器工作正常。
对于我的程序以及数据库浏览器应用程序中的任何INSERT都会发生这种情况。
(如果我运行VACUUM操作,数据库可能会大幅缩小,因为我运行了很多INSERT语句)
我估计12个表中大约有35亿行。根据我的阅读,这个大小的SQLite数据库应该没有问题。
为什么会发生这种情况以及如何解决这个问题?理想情况下,如果我不必从头开始整个导入过程会很好,因为它花了几天才达到这一点,只有大约20%完成。
答案 0 :(得分:1)
Windows错误代码665表示消息的确切含义:文件系统已达到某个限制。
限制不在于文件大小本身,而在于管理碎片文件所需的内部结构数量。 (完全相同的问题happens with Microsoft's own SQL Server。)
Microsoft有一个hot fix,允许您使用为这些结构预留更多空间的文件系统重新格式化驱动器。 但是现在解决这个问题的一种更简单的方法是运行碎片整理程序,或者只创建一个新的文件副本(如果你有足够的可用空间)。
如果可能,请尽量避免对文件进行分段,即在填充数据库时不要将其他数据写入同一文件系统。 或者,为了避免较小的片段,通过临时插入一个大行来扩展数据库文件的大小:
CREATE TABLE t(x);
INSERT INTO t VALUES(zeroblob(500*1024*1024)); -- 500 MB
DROP TABLE t;