【发布时间】:2014-10-15 06:59:43
【问题描述】:
我正在尝试使用 Python 执行一些昂贵的科学计算。我必须读取存储在 csv 文件中的一堆数据,然后进行处理。由于每个进程都需要很长时间,而且我要使用大约 8 个处理器,因此我尝试使用 Multiprocessing 中的 Pool 方法。
这就是我构建多处理调用的方式:
pool = Pool()
vector_components = []
for sample in range(samples):
vector_field_x_i = vector_field_samples_x[sample]
vector_field_y_i = vector_field_samples_y[sample]
vector_component = pool.apply_async(vector_field_decomposer, args=(x_dim, y_dim, x_steps, y_steps,
vector_field_x_i, vector_field_y_i))
vector_components.append(vector_component)
pool.close()
pool.join()
vector_components = map(lambda k: k.get(), vector_components)
for vector_component in vector_components:
CsvH.write_vector_field(vector_component, '../CSV/RotationalFree/rotational_free_x_'+str(sample)+'.csv')
我正在运行一个包含 500 个样本的数据集,其大小等于 100 (x_dim) x 100 (y_dim)。
在那之前一切正常。
然后我收到一个包含 500 个 400 x 400 样本的数据集。
运行它时,调用get时出现错误。
我还尝试运行 400 x 400 的单个样本并得到相同的错误。
Traceback (most recent call last):
File "__init__.py", line 33, in <module>
VfD.samples_vector_field_decomposer(samples, x_dim, y_dim, x_steps, y_steps, vector_field_samples_x, vector_field_samples_y)
File "/export/home/pceccon/VectorFieldDecomposer/Sources/Controllers/VectorFieldDecomposerController.py", line 43, in samples_vector_field_decomposer
vector_components = map(lambda k: k.get(), vector_components)
File "/export/home/pceccon/VectorFieldDecomposer/Sources/Controllers/VectorFieldDecomposerController.py", line 43, in <lambda>
vector_components = map(lambda k: k.get(), vector_components)
File "/export/home/pceccon/.pyenv/versions/2.7.5/lib/python2.7/multiprocessing/pool.py", line 554, in get
raise self._value
MemoryError
我该怎么办?
提前谢谢你。
【问题讨论】:
-
你的内存用完了吗?
-
好像是这样,既然你提到了(我正在通过 ssh 运行它)。
-
完全填充
vector_components的内容后,您想做什么?您现在的样本量似乎太大而无法放入内存,因此您一次只能将其中的一部分保存在内存中。 -
那么您只有 3 个解决方案 - 更小的数据集/将您的数据分成块并独立处理它们/获得更多内存
-
我想保存它们中的每一个(在另一个 csv 中),因为它们已被处理。我可以在 Python 中使用 Pool 来做到这一点吗?
标签: python memory multiprocessing