1

統計を生成するには、54,000を超える多くのSQLiteデータベースを読み取る必要があります。

Sequel3.44.0とSqlite1.3.7を使用して、Ruby1.8.7パッチレベル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のメモリ使用量に達すると、プログラムは停止しました。

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にステップアップするときが来たと思います。これにより、非常に多くの個別のデータベースを開くためにRAMが不足する問題が即座に修正されます。PostgreSQLをお勧めしますが、MySQLも簡単に対応できます。

54,000の個別のテーブルが必要な場合でも、単一のテーブルを使用してサーバーに接続しSequel.connect、メソッドを使用してテーブルを反復処理して、DB.tablesメモリを節約できます。

これを行うことのもう1つの利点は、統計のためにさまざまなテーブル間でデータを簡単に相関させることができることです。

于 2013-04-21T17:19:35.427 に答える