当前位置:   article > 正文

多线程共享内存之DATAFRAME_pd.dataframe 线程

pd.dataframe 线程

用CHATGPT做了辅助,结果一团糟,这东西也没那么智能,反馈如下:


在Python中使用多进程并发执行任务时,如果需要共享数据,需要使用共享内存或其他进程间通信(IPC)机制。对于大型数据,如1GB的Dataframe,使用共享内存更为高效。
下面是一个使用Python中的共享内存模块multiprocessing.shared_memory来共享Dataframe的示例:
首先,我们可以将Dataframe保存为一个二进制文件,然后在主进程中将该文件映射到共享内存中,然后在子进程中使用该共享内存。代码示例:
在上面的代码中,我们首先将Dataframe保存为一个二进制文件data.pkl,并将其映射到共享内存中。然后,在子进程中,我们可以使用共享内存中的数据来对Dataframe进行操作。
需要注意的是,在使用共享内存时,需要确保所有进程都使用相同的数据类型和大小,否则可能会导致数据不一致或错误。
另外,如果Dataframe的大小超过了系统可用内存的大小,那么使用共享内存可能会导致性能下降,甚至出现内存溢出的问题。在这种情况下,可能需要考虑其他方法来处理数据,例如使用分布式计算框架。

import pandas as pd
import numpy as np
import multiprocessing as mp

# 将DataFrame保存为二进制文件
df = pd.DataFrame(np.random.rand(1000000, 10))
df.to_pickle('data.pkl')

# 将二进制文件映射到共享内存中
shm = mp.shared_memory.SharedMemory(create=True, size=df.memory_usage(deep=True).sum())
with open('data.pkl', 'rb') as f:
    shm.buf[:] = f.read()
    
# 在子进程中使用共享内存中的数据
def worker(shm_name):
    with mp.shared_memory.SharedMemory(name=shm_name) as shm:
        df = pd.read_pickle(shm.buf)
        # 在这里对Dataframe进行操作
        print(df.head())

if __name__ == '__main__':
    # 在主进程中启动子进程
    p = mp.Process(target=worker, args=(shm.name,))
    p.start()
    p.join()

# 删除共享内存
shm.close()
shm.unlink()

当涉及到在多个进程之间共享大量数据时,使用共享内存通常比使用Manager对象更快。因为共享内存允许多个进程在不进行复制的情况下同时访问同一块内存,而Manager对象需要使用IPC(进程间通信)机制将数据复制到每个进程中。
相比之下,Manager对象通过使用IPC机制将数据复制到每个进程中,需要额外的CPU和内存开销,因此在处理大量数据时,可能会降低性能。
在使用共享内存时,需要确保所有进程都使用相同的数据类型和大小,否则可能会导致数据不一致或错误。
总的来说,对于处理大型数据集,使用共享内存比使用Manager对象更为高效。但是,在某些情况下,使用Manager对象可能更容易实现和维护,例如需要在多个进程之间共享Python对象而不是原始数据的情况下。
综上所述,如果您要处理大型数据集,我建议您使用共享内存,而不是使用Manager对象。

这里的大坑就是,.PKL这个在MP指令中的SIZE是多少,如果用代码中的,会得到左右的内存结果不相同 LVALUE RVALUE什么的,SIZE如果用DF.DIZE,也是一样的ERROR,这里必须要用DF.__LEN__()才能匹配上,搞了一下午,一直在DEBUG这个CHATGPT给我留下的坑。。。。。。

不得不说,代码逻辑没问题,但是小细节真是粗糙

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号