2

さまざまな順序で何度もアクセスされるため、メモリにロードする必要のある個人レコードのデータベースがあります。これまで、レコードごとに1つのPythonオブジェクトをインスタンス化してきました。しかし、8,000,000のレコードを処理できるようになったので、この単純なアプローチに十分なメモリがありません。

フラットファイルでは、各レコードは最大500バイトしか使用せず、圧縮は行われません(圧縮を使用するとはるかに少なくなります)。したがって、データセット全体はディスク上で4GB未満です。ただし、各レコードがPythonによってオブジェクトとして読み込まれると、40GBのRAMが使用されると推定されます。私のマシンには12GBのRAMしかありません。

CをPythonプログラムと統合し、各レコードを構造体としてCに格納することを検討しています。これは良い解決策のように聞こえますか?または、Cとのインターフェースを必要としない、Pythonでレコードをコンパクトに保存するためのより良い方法はありますか?

更新:私が使用しているデータベースはHbase(http://hbase.apache.org/)で、Hadoopで実行されています。Pythonへの接続は、Thrift(http://thrift.apache.org/)を介して行われます。

更新2:データベース内のすべてのレコードにさまざまな順序でアクセスする必要があります。これらの順序は実行時に決定されます。反復ごとに、データベースに対して8,000,000のクエリを実行できると思いますが、これはかなり遅い可能性が高いと思います。

更新3:行を順番にアクセスできるように保存する良い方法はないと思います。次の反復でレコードが必要になる順序(私のプログラムは反復機械学習アルゴリズムです)は、前の反復中のデータ行列の特定の固有ベクトルへの線形代数射影によって決定されます。

4

4 に答える 4

3

これは、データベースの完璧なユースケースです。すべてをメモリに保存する代わりに、ディスクに保存して、好きなようにクエリを実行できます。

sqllite3は、優れた簡単なオプションの1つです。SQLAlchemyなどのオブジェクトリレーショナルマッパー(ORM)に特に関心があるかもしれません。これにより、Pythonオブジェクトの操作と同様のデータベースの操作が可能になります。

于 2012-08-27T19:12:38.320 に答える
2

numpyの構造化配列がここでうまく機能するようです。Pythonオブジェクトを使用するよりもはるかに少ないメモリを使用し、numpyはそれらに対して多くの高速で便利な操作を提供します。さらに、配列はメモリマップトファイルにすることができ、これは時々役立つことがあります。

データベースが適切なオプションであるかどうかは(他の人が示唆しているように)、アルゴリズムとデータサイズによって異なります。numpyの方が優れたソリューションである場合が多くあります(作業量が少ない、効率が高いなど)。

于 2012-08-28T11:03:18.580 に答える
0

必要なパフォーマンスとユースケースに応じて、これを処理する方法はたくさんありますが、実際にはすべてのデータをメモリに保持する必要はありません。sqlite明らかな方法の1つは、またはのような実際のデータベースエンジンを使用することですmysql。実装は簡単ですが、おそらくはるかに遅い方法ですshelve

于 2012-08-27T19:15:24.503 に答える
0

私はそのスレッドの他の人たちにデータベースが選択のツールになることに同意します、しかしあなたがメモリで主張するならhttp://www.memsql.com/を見てください(私はそれを使ったことがありませんが)

于 2012-08-27T20:18:58.903 に答える