さまざまな順序で何度もアクセスされるため、メモリにロードする必要のある個人レコードのデータベースがあります。これまで、レコードごとに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:行を順番にアクセスできるように保存する良い方法はないと思います。次の反復でレコードが必要になる順序(私のプログラムは反復機械学習アルゴリズムです)は、前の反復中のデータ行列の特定の固有ベクトルへの線形代数射影によって決定されます。