擅长:python、mysql、java
<p>你没有提到你正在使用的操作系统或者数据库文件的大小。Windows可能会对大于2Gb的文件产生问题,具体取决于版本。在</p>
<p>在任何情况下,由于这是一个美化的批处理脚本,为什么不去掉<code>for</code>循环,从<code>sys.argv</code>获取文件名,然后对每个合并数据库运行一次。这样你就永远不必在一个过程中处理过多的内存问题。在</p>
<p>请注意,如果您使用以下内容结束循环,则可能也会修复问题。在</p>
<pre><code>c.close()
completedb.close()
</code></pre>
<p>您说当您使用CLI执行此过程并在每次db之后退出时,会发生相同的情况。我假设您是指pythoncli,退出意味着您退出并重新启动Python。如果这是真的,而且每4个数据库仍然会出现一个问题,那么您的SQLITE共享库有问题。不应该是那样的。在</p>
<p>如果我站在您的立场上,我会停止使用<code>attach</code>,只在Python中打开多个连接,然后以每次提交大约1000条记录的方式批量移动数据。它会比您的技术慢,因为所有的数据都会在Python对象中来回移动,但我认为它也会更加可靠。打开完整的数据库,然后循环打开第二个数据库,复制,然后关闭第二个数据库。对于复制,我将对SELECT语句使用OFFSET和LIMIT来处理100条记录的批处理,然后提交,然后重复。
事实上,我也会在复制前计算completedb记录,以及第二个db记录,然后在复制之后对completedb记录进行计数,以确保我已经复制了预期的数量。另外,您将跟踪下一个偏移量的值,我会在提交后立即将其写入一个文本文件,这样我就可以随时中断并重新启动该进程,它将在它停止的地方继续进行。在</p>