首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python -如何在多个进程之间共享大型数据集?

Python -如何在多个进程之间共享大型数据集?
EN

Stack Overflow用户
提问于 2019-10-22 16:29:38
回答 2查看 303关注 0票数 2

我需要将一个大的数据集(大约25 it的图像)读入内存,并从多个进程读取它。所有的进程都不需要写,只需要读。所有进程都是使用Python的多处理模块启动的,因此它们具有相同的父进程。他们根据数据训练不同的模型,并且彼此独立运行。我之所以只想读一次,而不是每次读一次,是因为机器上的内存是有限的。

我试过使用Redis,但不幸的是,当许多进程从中读取时,它会非常慢。还有别的选择吗?

是否有可能有另一个进程只充当“使用ID获取图像”的函数?哪个Python模块适合这样做?否则,我正在考虑使用werkzeug或烧瓶实现一个小型的new服务器,但我不确定这是否会成为我当时的新瓶颈。

我想到的另一种可能性是使用线程而不是进程,但由于Python并不真正执行“真正”的多线程处理,这可能会成为我的新瓶颈。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-22 17:17:43

如果您是在 linux 上,并且内容是只读,则可以使用linux继承机制。

来自mp文档

继承胜于腌制/不腌制 当使用派生或叉服务器启动方法时,来自多进程的许多类型都需要是可选择的,以便子进程可以使用它们。但是,通常应该避免使用管道或队列将共享对象发送到其他进程。相反,您应该安排程序,以便需要访问在其他地方创建的共享资源的进程可以从祖先进程继承它。

这意味着:

在分叉子进程之前,在模块级别的变量(对所有函数都是全局的)中准备大数据。

然后,在同一个模块中,以“叉”模式set_start_method('fork')运行具有多进程的子进程。

使用此方法,子进程将在不复制变量的情况下看到该变量。这是因为linux分叉机制创建的子进程具有与父进程相同的内存映射(参见“复制在写上”)。

票数 4
EN

Stack Overflow用户

发布于 2019-10-22 17:02:18

我建议使用打开文件,这样就可以在多个进程之间共享它们,并在适当的情况下进行交换。

其细节将取决于您所说的“25 to图像”的含义,以及这些模型希望如何访问这些图像。

其基本思想是将图像预处理成一种适当的格式(例如,一个大的4D uint8数字数组或可能较小的数字数组,指数可以是(image, row, column, channel)),并将它们保存在模型可以有效使用的格式中。有关这方面的一些示例,请参见numpy.memmap

我建议将文件预处理成一种有用的“离线”格式,即不是模型培训的一部分,而是先运行的独立程序。因为这可能需要一段时间,而且你可能不想每次都这么做

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58508640

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档