1

わかりました。本当に助けが必要な問題があります。

私のプログラムは、pdb ファイルから値を読み取り、それらの値を (array = []) に格納します。次に、この格納された値の配置から 4 のすべての組み合わせを取得し、これを maxcoorlist というリストに格納します。組み合わせのリストは非常に多数であるため、作業を高速化するために、この組み合わせのリストから 1000 ~ 10000 のサンプルを簡単に取得したいと思います。ただし、そうすると、ランダムサンプルを取得する行でメモリエラーが発生します。

MemoryError                               Traceback (most recent call last)
<ipython-input-14-18438997b8c9> in <module>()
     77     maxcoorlist= itertools.combinations(array,4)
     78     random.seed(10)
---> 79     volumesample= random_sample(list(maxcoorlist), 1000)
     80     vol_list= [side(i) for i in volumesample]
     81     maxcoor=max(vol_list)

MemoryError: 

シードを使用して他のサンプルを取得するため、このコードでも random.seed() を使用することが重要です。

4

4 に答える 4

1

他の回答で述べたように、 list() 呼び出しによりメモリが不足しています。

代わりに、最初に maxcoorlist を繰り返し処理して、その長さを調べます。次に、範囲 [0, length) の乱数を作成し、インデックス セットの長さが 1000 になるまでインデックス セットに追加します。

次に、maxcoorlist を再度反復処理し、現在のインデックスがインデックス セットにある場合は、現在の値をサンプル セットに追加します。

編集

最適化は、maxcoorlist の長さを反復するのではなく、直接計算することです。

import math
n = len(array)
r = 4
length = math.factorial(n) / math.factorial(r) / math.factorial(n-r)
于 2013-07-29T22:15:38.163 に答える
0
maxcoorlist= itertools.combinations(array,4)
...
volumesample= random_sample(list(maxcoorlist), 1000)

実行すると、そこからすべてのvolumesample組み合わせのリストが作成されます...次に、1000までサンプリングします...

リスト全体を作成する必要があるサンプルの代わりに、次のように islice を適用してください。

from itertools import islice
volumesample = list(islice(maxcoorlist, 1000))

最初の 1000 を取得します。よりサンプル風の効果を得るために、n番目ごとなどに調整することができます...

于 2013-07-29T22:10:08.987 に答える
0

次のように、リストではなくタプルを使用するようにコードをリファクタリングしてみてはどうでしょうか。

maxcoorlist= itertools.combinations(array,4)
random.seed(10)
volumesample= random.sample(tuple(maxcoorlist), 1000)
vol_list= [side(i) for i in volumesample]
maxcoor=max(vol_list)
于 2013-07-29T22:17:11.943 に答える
0

おそらく膨大な量のメモリ (および時間) をmaxcoorlist占有しており、リストへのキャストにより、占有しているメモリ スペースが 2 倍になります。おそらく、1000 のランダムな組み合わせを自分で生成する必要があります。4 つの要素をランダムにサンプリングし、その組み合わせがリストにあるかどうかを確認します (並べ替えて、 を使用しますthis_combination in combination_listcombination_listが の場合set、このチェックは O(1) になります) 。

このようにして、必要なだけのメモリしか使用しません。

于 2013-07-29T22:12:59.933 に答える