【发布时间】:2020-07-07 08:29:12
【问题描述】:
我有以下工作流程,我将数据附加到一个空的 pandas Series 对象。 (这个空数组也可以是一个 NumPy 数组,甚至是一个基本列表。)
in_memory_array = pd.Series([])
for df in list_of_pandas_dataframes:
new = df.apply(lambda row: compute_something(row), axis=1) ## new is a pandas.Series
in_memory_array = in_memory_array.append(new)
我的问题是生成的数组 in_memory_array 对于 RAM 来说太大了。我不需要将所有对象都保存在内存中以进行此计算。
我认为我的选择是以某种方式将对象腌制到磁盘上,一旦阵列变得太大而无法使用 RAM,例如
# N = some size in bytes too large for RAM
if sys.getsizeof(in_memory_array) > N:
with open('mypickle.pickle', 'wb') as f:
pickle.dump(in_memory_array, f)
否则,是否有核外解决方案?最好的情况是创建一些上限,以使对象在 RAM 中的大小不能超过 X GB。
【问题讨论】:
-
您可以将结果堆叠在一个唯一的 numpy 数组中,并使用
x.__sizeof__()检查其大小。当超过某个阈值时,您可以写入磁盘并重新启动该过程。 -
@FBruzzesi 这是一个很好的计划,使用
sys.getsizeof()或__sizeof__()。我还不确定跟踪索引的最佳方法。 -
您需要跟踪哪些指标?
标签: python arrays numpy memory bigdata