8

我是 python 新手,开始使用遗传算法 (GA) 来进行某种曲线拟合。对于那个 GA,我正在使用(很棒的)pyevolve 库(http://pyevolve.sourceforge.net/),它能够通过使用多处理来极大地减少计算时间。

这就是我的问题出现的地方:我想要近似的曲线是一个从 excel 文件中读取并在我的程序开始时存储为全局变量的数组。使用 python 多处理模块时,每个进程都会使用自己的全局变量创建自己的 python 实例。这会导致每一代算法(意味着每个进程)中的每个人一次又一次地打开和读取 excel 文件。打开大的 excel 文件可能会花费大量时间,因此只需打开该文件一次并让每个进程/个人都可以使用读取数组会很好。

多处理是在 pyevolve 库中启动的,我不想更改它以使其易于更新。不幸的是,这意味着只需通过例如将变量传递给进程池

p = Process(target=my_func,args=(my_array))

不是我的选择。这是迄今为止我找到的唯一解决方案。

有谁知道另一种让 my_array 可以从每个进程访问的方法?

4

2 回答 2

1

如果其他人面临这个问题,我只是想让你知道我是如何解决这个问题的:

我的解决方案不适用于一般的与 python 相关的问题,但在使用 pyevolve 时会有所帮助,这对我来说就足够了。我不知道的是,在 pyevolve 中,您可以通过以下方式将参数添加到您的基因组或遗传算法实例中

my_genome.setParams(xyz=my_array) 或者 my_ga.setParams(xyz=my_array)

这些参数可以通过

my_genome.getParam('xyz')my_ga.getParam('xyz')

每个进程都可以访问这些参数,因此我的问题得到了解决,我不需要考虑一般的 python 多处理问题。我希望这对其他人有帮助!

于 2016-07-12T10:27:07.847 回答
1

查看mmap,这是用于创建可在进程之间共享的内存映射文件的 Python 接口。您可能想要以下内容:

import mmap
import os
import ctypes

mm = mmap.mmap(-1, 13)
mm.write('Hello world!')

mm_addr = id(mm)

with open('shared_id', 'w') as f:
    f.write(str(mm_addr))

pid = os.fork()

if pid == 0:  # In a child process
    id_from_file = long(open('shared_id').read())
    loaded_mm = ctypes.cast(id_from_file, ctypes.py_object).value
    loaded_mm.seek(0)
    print loaded_mm.readline()
    loaded_mm.close()

我使用这个问题来弄清楚如何获取共享内存映射的物理内存地址并将其转换回 Python 对象。

我想您也可以使用内存中的任何对象而不是 mmap 来执行此操作,但我还没有尝试过。

于 2016-06-05T22:30:40.457 回答