繁体   English   中英

大型DB文件的SQLite磁盘I / O错误

[英]SQLite disk I/O error with large DB file

在我的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%完成。

Windows错误代码665表示消息的确切含义:文件系统已达到某个限制。

限制不在于文件大小本身,而在于管理碎片文件所需的内部结构数量。 微软自己的SQL Server也会出现同样的问题。)

Microsoft有一个热修复程序 ,允许您使用为这些结构保留更多空间的文件系统重新格式化驱动器。 但是现在解决这个问题的一种更简单的方法是运行碎片整理程序,或者只创建一个新的文件副本(如果你有足够的可用空间)。

如果可能,请尽量避免对文件进行分段,即在填充数据库时不要将其他数据写入同一文件系统。 或者,为了避免较小的片段,通过临时插入一个大行来扩展数据库文件的大小:

CREATE TABLE t(x);
INSERT INTO t VALUES(zeroblob(500*1024*1024));  -- 500 MB
DROP TABLE t;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM