我正在尝试在Python中的父进程和子进程之间共享对象.为了解决这个想法,我创建了一个简单的Python脚本:
from multiprocessing import Process
from os import getpid
import psutil
shared = list(range(20000000))
def shared_printer():
mem = psutil.Process(getpid()).memory_info().rss / (1024 ** 2)
print(getpid(), len(shared), '{}MB'.format(mem))
if __name__ == '__main__':
p = Process(target=shared_printer)
p.start()
shared_printer()
p.join()
Run Code Online (Sandbox Code Playgroud)
代码片段使用优秀的psutil库来打印RSS(驻留集大小).当我在OSX上用Python 2.7.15运行它时,我得到以下输出:
(33101, 20000000, '1MB')
(33100, 20000000, '626MB')
Run Code Online (Sandbox Code Playgroud)
当我在Ubuntu上运行完全相同的代码片段(Linux 4.15.0-1029-aws#30-Ubuntu SMP x86_64 GNU/Linux)时,我得到以下输出:
(4077, 20000000, '632MB')
(4078, 20000000, '629MB')
Run Code Online (Sandbox Code Playgroud)
请注意,子进程'RSS在OSX上是基本的0MB,与Linux中的父进程'RSS大小相同.我曾假设写入时复制行为在Linux中的工作方式相同,并允许子进程为大多数页面引用父进程的内存(可能除了存储对象头部的内存之外).
所以我猜测2系统中的写时复制行为存在一些差异.我的问题是:在Linux中我能做些什么来获得类似OSX的写时复制行为?
python linux copy-on-write shared-memory python-multiprocessing
所以我从别人那里继承了这个Android项目.代码目前似乎是将大量数据(应该属于SQLite数据库)存储到共享首选项中.我对这部分代码感到非常不舒服,并希望开始使用sqlite数据库.但是我仍然无法向自己证明自己需要的时间,特别是如果它没有立竿见影的好处.
当然,我最终会把它转移到sqlite,但由于我有点紧张的截止日期,我想知道这是否值得现在或以后做些什么.
任何关于在共享偏好中存储大量数据的想法和评论都将非常受欢迎.
谢谢