问题标签 [python-multiprocessing]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - python - 多处理比顺序慢
这是我的第一个多处理实现,我已经按顺序执行了我的代码,我花了大约 30 秒来处理 20 条记录。但是我创建了一个字典,每个键都有一组记录,并尝试使用 pool.map 为每个键应用该函数。现在虽然我正在为每个进程分配每个核心,但现在需要超过 2 分钟的时间来处理。有人可以帮我优化这个。
python - 并行化组合python
如何并行化以下代码,属性列中的元素数量接近 15,因此组合需要更多时间。
有什么方法可以使用多处理并行化它?
我试过这个,但我收到了这个错误。- 如果块大小 <= 0:
TypeError:不可排序的类型:range() <= int()
既然被要求解释这个问题,那么你就去吧......我试图在不更换的情况下获得组合。基本上是n!。例如,如果我的属性变量中有 A,B,C,我试图获取 (A),(B),(C),(A,B),(A,C),(A,B, C)。由于属性中的元素数量不是静态的,并且会根据输入数据集而变化,因此我无法对其进行硬编码。所以,我在这里使用 len(attributes),其中属性将存储数据集中的属性。然后创建组合, itertools.combinations(attributes,L) 通常会创建长度 L 的所有组合。在我的示例中,如果我给出长度(属性),那么我将只得到 ABC,而不是其他组合。所以我创建了一个长度范围并添加一个来处理第零个元素。
现在回到问题上来,我的数据集中可能有 15 个元素,因此长度(属性)将是 15,即 15!。这个组合生成需要很多时间,因为它必须做这个阶乘。所以我正在考虑以每个处理器一次处理一个组合集生成的方式并行化它,例如一个处理器将生成长度为 2 和长度为 3 的其他组合的所有组合,等等......但是在池映射中我我无法正确传递多个论点。希望这可以清除情况,如果需要进一步解释,请告诉我。
python - ElementTree 并行节点创建
我正在将图形对象写入 xml 表示。我的单片代码运行良好,但在我的大图上太慢了。我正在尝试将其并行化,但我没有SubElement
从池中获得支持。我确定我遗漏了一些明显的东西,但我是 python 新手。
python - Python 多处理和序列化数据
我正在使用该multiprocessing
模块在学校计算机上运行脚本。我经常序列化数据。可以用下面的代码来概括:
因此,当我实际运行我的代码以进行更多模拟以及我想象的更密集的各种任务时,我收到以下错误:IOError: [Errno 5] Input/output error
通常以file.open(...)
or开头file.close()
。
我的问题:
- 如何在我的脚本中修复此错误?
- 这个错误对 python 新手意味着什么?参考赞赏。
关于我的程序的更多说明:
- 我没有将 multiprocess 属性设置
daemon
为True
,而是使用 screen 来运行脚本然后分离。这使我也可以断开连接,而不必担心我的脚本会停止。 - 这似乎是关于使用模块打印的相关问题。
subprocess
正如我所说,我没有明确使用守护进程,所以不确定这是否有帮助。 - 这通常在运行大约一天后发生,并且在不同的时间发生在不同的进程上。
python - 用于超集计算的python集处理
我现在有三个输入,
我正在尝试将 combs_dict 与 map_dict 进行比较。如果combs_dict 中的任何键是map_dict 值中任何元素的超集(> =),那么我必须将该键的相应概率从prob_dict 添加到combs_dict 的值。
例如,如果我从 combs_dict 获取 freezeset({'rfid', 'time'}) 并与 map_dict 中的值进行比较,发现它是这个 {'2': {frozenset({'rfid', ' time'})、frozenset({'zone', 'time'})} 和 this '3': {frozenset({'rfid', 'time'}),因为它们都有其等价物或子集。我将不得不从 prob_dict 中获取其密钥 2 和 3 的概率,并将其与 combs_dict 中的值相加,如下所示 (frozenset({'rfid', 'time'}): '0'+'0.5+'0.05' )。
我现在尝试的是这个,
但我无法在“v”中添加概率,因为 j 作为生成器返回。有人可以帮忙吗。是否有任何选项可以使用多处理并行化?因为我将在 comb_dict 中拥有近 50k 冻结集,所以我必须将每个冻结集与 map_ouput 中的每个元素进行比较。
如果有任何不清楚的地方,请告诉我。我会解释。
python - 并行化递归python
我现在正在处理一个大数据集。我的输入将是 4 个不同的数据集,我必须对每个数据集应用一个特定的函数。所以我所做的是读取所有四个数据集并使用 pool.map 将函数并行应用于每个数据集。所以现在我有一个父进程和 4 个子进程。到此为止一切都很好。
Q1。现在每个进程内部会发生什么。在我对每个数据集应用的函数中,我将每个元组与其他元组进行比较,因此它是一种递归。有没有办法让它并行,因为这个比较可能需要很长时间,因为数据集会很大。如何制作它,因为它已经是一个子进程?是否可以在子进程中再次并行化它,因为我有更多的处理器,所以我想利用它。
Q2。对于这个递归任务的并行化,我想到的是,如果我将元组 x 与元组 y(每个元组与所有其他元组)进行比较,我可以为 x 制作块,每个块都与 y 进行比较。我想这可以通过两个“for 循环”来完成。任何建议如何做到这一点?
python - 两台不同机器上的 Python 多处理池性能差异
所以我在同一个python虚拟环境中的两台不同的机器上部署了相同的代码,操作系统/内核完全相同,硬盘型号相同。两台机器之间唯一的主要区别是 CPU。机器 1 具有 2x Xeon E5-2690(16 核 @ 2.90 ghz),机器 2 具有 1x Xeon W3690(6 核,3.47 ghz)。
现在,当我运行不使用多处理池的代码版本时,机器 1 将运行得更快。但是,当使用多处理池时,机器 2 的运行速度会明显加快(大于 6 倍)。事实上,无论我创建多少线程,机器 1 的运行速度都不会比单线程版本快得多。
有问题的过程只是读取 HDF5 文件并对数据执行一些基本的数学运算。
有人建议我运行 strace -c,我的结果显示机器 1 上的 futex 花费了更多时间。但是由于我只运行了一次,因此没有真正的统计确定性。
我很确定这个问题与多处理产生的开销有关,但这是一个很大的差异。我也很难相信 0.57 ghz 也会造成如此大的差异。有任何想法吗?
谢谢!
编辑:
所以这是我在不处理 IO 的情况下运行的测试:
机器1:
机器2:
python - 无法将 lxml etree 对象传递给单独的进程
我正在开发一个项目,以使用 lxml 在 python 中同时解析多个 xml 文件。当我初始化进程时,我希望我的主类在将 etree 对象传递给进程之前对 XML 做一些工作,但我发现当 etree 对象到达新进程时,类仍然存在,但 XML 从在对象中,getroot() 返回 None。
我知道我只能使用队列传递可选数据,但是我传递给“args”字段内的进程的情况也是如此吗?
这是我的代码:
非常感谢任何和所有帮助。
更新/回答
根据下一篇文章中的答案,我对其进行了一些修改,并设法使其在不使用 String IO 的情况下以更低的内存占用工作。etree.tostring 方法返回一个字节数组,它可以被腌制,然后解除腌制,字节数组可以被 etree 解析。
更新 2
在对内存进行了一些基准测试后,我发现传递大对象会导致对象无法通过主进程上的垃圾收集来清除。这可能不是小规模的问题,但 etree 对象在内存中的数量级为数百 MB。一旦在语句中使用 XML 对象调用了异步任务,如果从主进程中删除该对象,即使我手动调用垃圾收集,也无法从内存中清除该对象。因此,我恢复到在主进程中关闭 XML 并将文件名传递给子进程。
python - 使用 Python 多处理无法将 LDAP 对象共享给子进程
我将有一个子流程来发送 LDAP 查询和其他子流程来检索响应。在两个进程之间共享 LDAP 对象存在问题。有人可以指出我的解决方案吗?
错误与泡菜模块有关:
python - Python多处理模块:加入超时进程
我正在优化复杂模拟的参数。我正在使用多处理模块来提高优化算法的性能。我在http://pymotw.com/2/multiprocessing/basics.html学到了多处理的基础知识。根据优化算法的给定参数,复杂的模拟持续不同的时间,大约 1 到 5 分钟。如果参数选择得非常糟糕,模拟可能会持续 30 分钟或更长时间,并且结果没有用处。所以我正在考虑在多处理中建立一个超时,这会终止所有持续时间超过定义时间的模拟。这是问题的抽象版本:
该行p.join(5)
定义了 5 秒的超时。由于 for 循环for p in procs:
,程序等待 5 秒,直到第一个进程完成,然后再等待 5 秒,直到第二个进程完成,依此类推,但我希望程序终止所有持续超过 5 秒的进程。此外,如果没有一个进程持续超过 5 秒,则程序不得等待这 5 秒。