我需要阅读超过54,000个数据库的许多SQLite数据库来生成统计信息。
我创建了一个Ruby应用程序,使用Sequel 3.44.0和Sqlite 1.3.7在Ruby 1.8.7 patchlevel 371上运行。
我写了这段代码来读取数据库:
for i in databases
db= Sequel.sqlite(i)
# DB'query and other operation
db.disconnect
end
一段时间后,程序崩溃,没有错误。我在应用程序运行时查看了内存的消耗情况,直到内存大小为止。
这是垃圾收集问题吗?或者我有任何错误?有没有用Ruby读取大量数据库的方法?
编辑:
我有4GB内存。我尝试过:
databases.each { |i| }
但没有任何效果。当程序达到2GB内存时,它停止运行。
答案 0 :(得分:2)
Sequel缓存您在Sequel::DATABASES
数组中连接的数据库。如果从大量数据库连接/断开连接,则应从Sequel::DATABASES
阵列中删除数据库对象,以便可以对它们进行垃圾回收。
答案 1 :(得分:0)
如果您有54,000个SQLite数据库,我认为现在是时候升级到能够包含这些单个文件数据的功能更强大的DBM了。由于打开了这么多单独的数据库,这将立即解决RAM耗尽的问题。我会推荐PostgreSQL,但MySQL也很容易完成任务。
即使您必须拥有54,000个单独的表,也可以使用单个Sequel.connect
连接到服务器,并使用DB.tables
方法遍历表,从而节省内存。
这样做的另一个好处是,您可以轻松地跨不同表格关联统计数据。