【发布时间】:2019-11-17 06:21:22
【问题描述】:
我有一个编码为 2048 位向量的 2215 个分子的列表。我想做的是从中创建二维数组。我正在使用 rdkit library 转换为 numpy 数组。几周前代码运行没有问题,现在出现内存错误,但我不知道为什么。谁能提供解决方案?
我试图使列表更小,并将其减少到两个向量。我认为这会有所帮助,但经过一段时间的处理后仍然会出现错误。这让我相信我确实有足够的记忆力。
# red_fp is the list of bit vectors
def rdkit_numpy_convert(red_fp):
output = []
for f in fp:
arr = np.zeros((1,))
DataStructs.ConvertToNumpyArray(f, arr)
output.append(arr)
return np.asarray(output)
# this one line causes the problem
x = rdkit_numpy_convert(red_fp)
这是错误:
MemoryError Traceback (most recent call last)
MemoryError: cannot allocate memory for array
The above exception was the direct cause of the following exception:
SystemError Traceback (most recent call last)
<ipython-input-14-91594513666c> in <module>
----> 1 x = rdkit_numpy_convert(red_fp)
<ipython-input-13-78d1c9fdd07e> in rdkit_numpy_convert(red_fp)
4 for f in fp:
5 arr = np.zeros((1,))
----> 6 DataStructs.ConvertToNumpyArray(f, arr)
7 output.append(arr)
8 return np.asarray(output)
SystemError: <Boost.Python.function object at 0x55a2a5743520> returned a result with an error set
【问题讨论】:
-
您能分享一个您正在使用的
red_fp的示例定义吗?此外,提及您正在使用 rdkit 并标记问题会吸引合适的人来帮助您解决问题。 -
我不确定您所说的示例定义是什么意思。一个指纹只有 2048 个整数(0 或 1,大多为 0)。然后 fp 是 2215 个指纹的列表,red_fp 只是一小部分指纹,用于检查它是否适用于更少量的信息
-
该函数使用的不是
red_fp,而是fp。fp来自哪里?它在全球范围内吗?这是你的意图吗?也许你希望函数使用 red_fp?:for f in red_fp: -
最早是用fp写的。我没有注意到它,现在它已修复(对于 red_fp 中的 f)但错误仍然存在。
-
对我来说,您的代码适用于 5979 个分子、RDKit 2019.03.3、numpy 1.16.4、Python 3.7.3、Windows 7 和 4GB RAM。