64

Pythonで20万以上のデータポイントを持つ1000次元データのアルゴリズムを実装しようとしています。numpy、scipy、sklearn、networkx、およびその他の便利なライブラリを使用したい。すべてのポイント間のペアワイズ距離などの操作を実行し、すべてのポイントでクラスタリングを実行したいと考えています。合理的な複雑さで必要なことを実行する実用的なアルゴリズムを実装しましたが、それらをすべてのデータにスケーリングしようとすると、RAM が不足します。もちろん、200k 以上のデータのペアごとの距離の行列を作成するには、多くのメモリが必要です。

ここに問題があります。RAM の量が少ない粗悪なコンピューターでこれを実行したいのです。

低RAMの制約なしでこれを機能させる実行可能な方法はありますか? 必要な時間が無限大にならない限り、それよりもはるかに長い時間がかかることは実際には問題ではありません!

アルゴリズムを機能させてから、1 時間か 5 時間後に戻ってきて、RAM が不足したためにスタックしないようにしたいと考えています。これを Python で実装し、numpy、scipy、sklearn、および networkx ライブラリを使用できるようにしたいと考えています。すべてのポイントなどへのペアごとの距離を計算できるようにしたい

これは実現可能ですか?そして、どうすればいいのでしょうか、何を読み始めることができますか?

4

1 に答える 1

84

ファイルに直接マップされた配列をnumpy.memmap作成します。

import numpy
a = numpy.memmap('test.mymemmap', dtype='float32', mode='w+', shape=(200000,1000))
# here you will see a 762MB file created in your working directory    

これを従来の配列として扱うことができます: a += 1000.

必要に応じて相互ソースから制御して、同じファイルにさらに多くの配列を割り当てることもできます。しかし、私はここでいくつかのトリッキーなことを経験しました。完全な配列を開くには、次を使用して、最初に前の配列を「閉じる」必要がありますdel

del a    
b = numpy.memmap('test.mymemmap', dtype='float32', mode='r+', shape=(200000,1000))

しかし、配列の一部だけを開くと、同時制御を実現できます。

b = numpy.memmap('test.mymemmap', dtype='float32', mode='r+', shape=(2,1000))
b[1,5] = 123456.
print a[1,5]
#123456.0

すごい!aとともに変更されましたb。そして、変更はすでにディスクに書き込まれています。

コメントする価値のあるもう 1 つの重要な点は、offset. の最初の 2 行でbはなく、150000 行と 150001 行を取得するとします。

b = numpy.memmap('test.mymemmap', dtype='float32', mode='r+', shape=(2,1000),
                 offset=150000*1000*32/8)
b[1,2] = 999999.
print a[150001,2]
#999999.0

これで、同時操作でアレイの任意の部分にアクセスして更新できるようになりました。オフセット計算で使用されるバイトサイズに注意してください。したがって、「float64」の場合、この例は 150000*1000*64/8 になります。

その他の参照:

于 2013-05-19T09:38:52.013 に答える