1

我需要阅读许多 SQLite 数据库,超过 54,000 个数据库,以生成统计信息。

我创建了一个 Ruby 应用程序,在 Ruby 1.8.7 补丁级别 371 上运行,使用 Sequel 3.44.0 和 Sqlite 1.3.7。

我写了这段代码来读取数据库:

for i in databases 
   db= Sequel.sqlite(i)
        # DB'query and other operation
   db.disconnect
end

一段时间后程序崩溃,没有错误。我在我的应用程序运行时查看了内存的消耗,它会增加直到 RAM 的大小。

是垃圾回收问题吗?还是我有什么错误?有没有用 Ruby 读取大量数据库的方法?


编辑:

我有 4GB 内存。我试过:

databases.each { |i| }

但没有任何效果。当程序达到 2GB 的内存使用它停止。

4

2 回答 2

2

Sequel 将您连接到的数据库缓存在Sequel::DATABASES阵列中。如果您从大量数据库连接/断开连接,您应该从Sequel::DATABASES阵列中删除您的数据库对象,以便它们可以被垃圾收集。

http://sequel.rubyforge.org/rdoc/classes/Sequel.html

于 2013-04-18T01:01:43.610 回答
0

如果您有 54,000 个 SQLite 数据库,我认为是时候升级到功能更强大的 DBM 了,它可以包含这些单个文件的数据。这将立即解决由于打开如此多的单独数据库而导致内存不足的问题。我会推荐 PostgreSQL,但 MySQL 也很容易胜任。

即使您必须拥有 54,000 个单独的表,您也可以使用单个表连接到服务器Sequel.connect并使用该DB.tables方法迭代表,从而节省内存。

这样做的另一个好处是您可以轻松地关联不同表中的数据以进行统计。

于 2013-04-21T17:19:35.427 回答