python - 使用批量提交系统时调试潜在的整数溢出?

标签 python numpy multiprocessing pbs

所以这是我的问题。我知道这不是一个很常见的问题,但这就是我问的部分原因:如何在这里寻求帮助?

所以我运行了一些用 Python 编写的代码。主进程使用多处理模块生成一些其他进程。一旦这些进程完成,它们就会通过管道将结果发送到主进程。他们发送的基本上是一些 numpy 数组和 float 。

还有一个大小不同的输入数据集,它被分成 block 并提供给每个工作进程。对于小到中等尺寸,一切正常。然而,当数据点的数量达到 1,000,000 个数量级时,就会出现问题。

在粘贴错误消息之前,我还想补充一下,我在使用 PBS 调度程序的系统上运行了这一切。这就是为什么我发现很难调试它:我不能只使用 pdb,而且需要几个小时才能产生错误。

无论如何,这是错误消息,您能给我一些如何修复它的提示吗?有什么问题吗?或者我应该在这个问题中包含哪些更多信息?

Process Process-4:
Traceback (most recent call last):
  File "/glade/u/apps/ch/opt/python/3.6.2/gnu/6.3.0/lib/python3.6/multiprocessing/process.py", line 249, in _bootstrap
    self.run()
  File "/glade/u/apps/ch/opt/python/3.6.2/gnu/6.3.0/lib/python3.6/multiprocessing/process.py", line 93, in run
    self._target(*self._args, **self._kwargs)
  File "/glade/u/home/mjurek/.local/lib/python3.6/site-packages/pyMRA/MRANode.py", line 102, in __init__
    pipe.send(self)
  File "/glade/u/apps/ch/opt/python/3.6.2/gnu/6.3.0/lib/python3.6/multiprocessing/connection.py", line 206, in send
    self._send_bytes(_ForkingPickler.dumps(obj))
  File "/glade/u/apps/ch/opt/python/3.6.2/gnu/6.3.0/lib/python3.6/multiprocessing/connection.py", line 393, in _send_bytes
    header = struct.pack("!i", n)
struct.error: 'i' format requires -2147483648 <= number <= 2147483647
Process Process-3:
Traceback (most recent call last):
  File "/glade/u/apps/ch/opt/python/3.6.2/gnu/6.3.0/lib/python3.6/multiprocessing/process.py", line 249, in _bootstrap
    self.run()
  File "/glade/u/apps/ch/opt/python/3.6.2/gnu/6.3.0/lib/python3.6/multiprocessing/process.py", line 93, in run
    self._target(*self._args, **self._kwargs)
  File "/glade/u/home/mjurek/.local/lib/python3.6/site-packages/pyMRA/MRANode.py", line 102, in __init__
    pipe.send(self)
  File "/glade/u/apps/ch/opt/python/3.6.2/gnu/6.3.0/lib/python3.6/multiprocessing/connection.py", line 206, in send
    self._send_bytes(_ForkingPickler.dumps(obj))
  File "/glade/u/apps/ch/opt/python/3.6.2/gnu/6.3.0/lib/python3.6/multiprocessing/connection.py", line 393, in _send_bytes
    header = struct.pack("!i", n)
struct.error: 'i' format requires -2147483648 <= number <= 2147483647

最佳答案

这是多处理中的一个限制——您尝试发送的数据显然大于 2 GB,因此生成的 pickle 字符串的长度不适合 32 位整数(这是你得到的异常(exception))。您应该使用共享内存来传输它,而不是将其作为参数传递(这会对其进行腌制)。

参见issue #17560 on the bug tracker.

关于python - 使用批量提交系统时调试潜在的整数溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48359044/

相关文章:

python - 将 re 与变量列表参数一起使用

python - 基于分配将 ndarray 的 "distribute"值转换为其他 ndarray 的更快方法?

Python Numpy 获取 2 个二维数组之间的差异

ios - 解决iOS ARM弱内存写排序的内存障碍?

python - 如何使用带锁的多处理队列

python - 使用 pandas 删除重复项,但没有正确删除重复项

python - Django:Obj.objects.all().values_list(列表)

python - 在 Apache Beam 中将 csv 转换为 dict,无需知道 header 字段名称

python - 从 numpy.datetime64 转换为 pandas.tslib.Timestamp 错误?

Python 多处理不断生成 pythonw.exe 进程而不做任何实际工作