python开辟共享内存存取数据

内存共享是两个不同的进程共享内存的意思:同一块物理内存被映射到两个进程的各自的进程地址空间。这个物理内存已经被规定了大小(大小一定要比实际写入的东东大)以及名称。当需要写入时,找到内存名称,然后写入内存,等需要读取时候, 首先要知道你要读取多大(因为物理内存比你要读取的东东大,全部读取的话会读到一些“空”的东西),然后寻找对应名称的物理块,然后读取,就是这么简单。

一般我们对数据的操作是直接对文件进行读取,比如

def get_datas():
    source_text_path = "路径"
    with open(source_text_path, 'rb') as f:
        data = f.readlines()
    yield data
 
 
if __name__ == '__main__':
    for e in get_datas():
        deal_data(e)  # 处理数据

这样虽然能处理数据,但是性能上却没有开辟共享内存来的快,在开辟共享内存来交互数据一个读入一次输出只要2步,而文件的操作至少需要4步,在数据量很大的情况下,就会浪费很多时间。

python中有mmap来开辟共享内存。

import mmap
mmap_file = None


##从内存中读取信息,
def read_mmap_info():    
    global mmap_file
    mmap_file.seek(0)
    ##把二进制转换为字符串
    info_str=mmap_file.read().translate(None, b'\x00').decode()
    print(info_str)
##如果内存中没有对应信息,则向内存中写信息以供下次调用使用
def get_mmap_info():
    global mmap_file
    ##第二个参数1024是设定的内存大小,单位:字节。如果内容较多,可以调大一点
    mmap_file = mmap.mmap(-1, 1024, access = mmap.ACCESS_WRITE, tagname = 'share_mmap')
    ##读取有效比特数,不包括空比特
    cnt=mmap_file.read_byte()
    if cnt==0:
        print("Load data to memory")
        mmap_file = mmap.mmap(0, 1024, access = mmap.ACCESS_WRITE, tagname = 'share_mmap')
        mmap_file.write(b"This is the test data")
    else :
        print("The data is in memory")
        read_mmap_info()

##修改内存块中的数据
def reset_mmp_info:
    global mmap_file
    mmap_file.seek(0)
    mmap_file.write(b'\x00')
    mmap_file.write(b"Load data to memory agine")


if __name__=="__main__":
    get_mmap_info()


 

猜你喜欢

转载自blog.csdn.net/qq_34904125/article/details/125038390