所以我创建了一个多处理列表(特别是 multiprocessing.Pool().starmap()
)并希望减少其内存大小。名单如下:
import sys
import numpy as np
from itertools import product
lst1 = np.arange(1000)
lst3 = np.arange(0.05, 4, 0.05)
lst1_1 = list(product(enumerate(lst3),
(item for item in product(lst1, lst1) if item[0] < item[1])
))
根据sys.getsizeof(lst1_1)
计算出的内存大小是317840928
看到lst1
的类型是int32
,我想把lst的dtype改成int16
可以减少的内存大小>lst1
,因此 ls1_1
减半,因为 int16
占用了一半的内存作为 int32
数据,所以我做了以下:
lst2 = np.arange(1000, dtype = np.int16)
lst2_1 = list(product(enumerate(lst3),
(item for item in product(lst2, lst2) if item[0] < item[1])
))
令人惊讶的是,sys.getsizeof(lst2_1)
计算出的lst2_1
的内存大小仍然是317840928
。
我的问题如下:
1)列表的内存大小是否与源数据的数据类型无关?
2) 如果是这样,那么在不转换为生成器的情况下减少列表内存大小的最佳方法是什么?
请注意,转换为生成器无济于事的原因是,即使它被转换为生成器,当它被扔进 multiprocessing.Pool().starmap()
时,它无论如何都会转换回列表。
最佳答案
在检查这些数组的大小之前,您正在将数组转换为 Python List
。
里面的整数被转换为 Python 对象。当你这样做时,它会导致更大的尺寸。这是您的代码的示例行为。
import sys
import numpy as np
lst1 = np.arange(1000)
lst2 = np.arange(1000, dtype = np.int16)
print(sys.getsizeof(lst1)) # 4096
print(sys.getsizeof(lst2)) # 2096
print(sys.getsizeof(list(lst1))) # 9112
print(sys.getsizeof(list(lst2))) # 9112
Numpy
是一个基于 C 的库,因此您可以选择要使用的整数类型(就像 int、long、long long)。您需要将数据保留为 C 类型,以便保留这些优势。这就是为什么 Numpy
本身有这么多功能,将操作和数据保持在较低级别。
关于python - 减少 multiprocessing.Pool.starmap() 列表的内存大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57155186/