在Python进程中共享内存中的大型数据结构?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了在Python进程中共享内存中的大型数据结构?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1748字,纯文字阅读大概需要3分钟。
内容图文
我们在Linux机器上运行了大约10个Python进程,它们都读取相同的大型数据结构(恰好是Pandas DataFrame,本质上是2D numpy矩阵).
这些进程必须尽快响应查询,并且将数据保存在磁盘上的速度根本不足以满足我们的需求.
我们真正需要的是所有进程都可以完全随机访问内存中的数据结构,因此它们可以检索执行任意计算所需的所有元素.
由于其大小,我们无法在内存中复制数据结构10次(甚至两次).
有没有办法让所有10个Python进程可以共享对内存中数据结构的随机访问?
解决方法:
fork()上的Because Linux supports Copy-on-Write(COW),不复制数据
除非写入.
因此,如果您在全局命名空间中定义DataFrame,df,那么您
可以根据需要从随后生成的子进程中访问它,
并且不需要额外的DataFrame内存.
只有当其中一个子进程修改df(或与df在同一内存页面上的数据)时,才会复制数据(在该内存页面上).
因此,听起来很奇怪,除了在生成子进程之前定义全局命名空间中的数据之外,您不必在Linux上执行任何特殊操作来共享对子进程之间的大型内存中数据结构的访问.
Here is some code演示了写时复制行为.
修改数据后,将复制其所在的内存页面.
如this PDF所述:
Each process has a page table which maps its virtual addresses to
physical addresses; when the fork() operation is performed, the new
process has a new page table created in which each entry is marked
with a ‘‘copy-on- write’’ flag; this is also done for the caller’s
address space. When the contents of memory are to be updated, the
flag is checked. If it is set, a new page is allocated, the data from
the old page copied, the update is made on the new page, and the
‘‘copy-on-write’’ flag is cleared for the new page.
因此,如果内存页面上的某个值有更新,那么该页面就是
复制.如果大型DataFrame的一部分驻留在该内存页面上,则只复制该部分,而不是整个DataFrame.
By default the page size is usually 4 KiB但可以更大,具体取决于how the MMU is configured.
类型
% getconf PAGE_SIZE
4096
查找系统上的页面大小(以字节为单位).
内容总结
以上是互联网集市为您收集整理的在Python进程中共享内存中的大型数据结构?全部内容,希望文章能够帮你解决在Python进程中共享内存中的大型数据结构?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。