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并且强制转换为列表会使它占用的内存空间增加一倍。您可能应该自己生成 1000 个随机组合:随机抽取 4 个元素,然后检查该组合是否在您的列表中(对它们进行排序,并使用this_combination in combination_list。如果combination_list是 a set,那么这个检查将是 O(1))

这样,您只需要尽可能多的内存。

于 2013-07-29T22:12:59.933 回答
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 回答