2013-02-10 62 views
1

我需要讀取54,000多個數據庫中的許多SQLite數據庫才能生成統計信息。Ruby續集內存泄漏?

我創建了一個使用Sequel 3.44.0和Sqlite 1.3.7在Ruby 1.8.7 patchlevel 371上運行的Ruby應用程序。

我寫了這個代碼讀取數據庫:

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

一個在程序沒有錯誤崩潰之後。當我的應用程序運行時,我查看了內存的消耗,並增加到RAM的大小。

這是垃圾收集問題嗎?或者我有什麼錯誤?有沒有用Ruby讀取大量數據庫的方法?


編輯:

我有4GB RAM。我試過:

databases.each { |i| } 

但沒有任何工作。當程序達到2GB的內存使用它停止。

+3

可能是一個範圍界定問題。試試'databases.each {| i | ''。無論如何,沒有人使用'for'循環。 – Reactormonk 2013-02-10 14:43:46

+0

'for in in'不是數組迭代的Ruby特定方法。您應該嘗試使用「每個」或其他塊方法。 – 2013-02-10 15:02:46

+0

你在圈內做什麼?您是否將所有數據庫的數據收集到中央數據存儲器?你寫道:「沒有錯誤崩潰」。屏幕上最後的信息是什麼?或者你雙擊啓動你的腳本,屏幕消失 - 然後從一個shell啓動你的應用程序來查看最後一條消息。 – knut 2013-02-10 16:13:33

回答

0

如果你有54000 SQLite數據庫,我想它的時候,你要抓緊一個更強大的DBM可以包含這些單個文件的數據。這將立即解決由於打開這麼多獨立的數據庫而導致內存用完的問題。我會推薦PostgreSQL,但MySQL也很容易完成任務。

即使您必須具有54,000個單獨的表,也可以使用單個Sequel.connect連接到服務器,並使用DB.tables方法遍歷表,從而節省內存。

這樣做的另一個好處是您可以輕鬆地關聯不同表格中的數據以便統計您的統計數據。