首页 > 解决方案 > python中的SharedMemory如何定义大小?

问题描述

我对 python3.8 中的 SharedMemory 有一些问题,任何帮助都会很好。

问题 1。

SharedMemory 有一个参数 SIZE,文档告诉我单位是字节。我创建了一个 1 字节大小的实例,然后,让 shm.buf=bytearray[1,2,3,4],它可以工作,没有任何异常!为什么?

问题2。

为什么打印缓冲区是内存地址?

为什么我将大小设置为 1 字节,但结果显示它分配了 4096 字节?

为什么缓冲区地址和缓冲区[3:4]地址相差3X16X16byte?

为什么缓冲区 [3:4] 地址与缓冲区 [1:3] 地址相同?

from multiprocessing import shared_memory, Process


def writer(buffer):
    print(buffer)  # output: <memory at 0x7f982b6234c0>
    buffer[:5] = bytearray([1, 2, 3, 4, 5])
    buffer[4] = 12
    print(buffer[3:4])  # output: <memory at 0x7f982b6237c0>
    print(buffer[1:3])  # output: <memory at 0x7f982b6237c0>

if __name__ == '__main__':
    shm = shared_memory.SharedMemory('my_memory', create=True, size=1)
    print(shm.size)  # output: 4096
    writer(shm.buf)
    print('shm is :', shm)  # output: shm is : SharedMemory('my_memory', size=4096)

标签: pythonoperating-systemmultiprocessing

解决方案


回答问题 2:

buffer[3:4]正如您所想的那样,它不是数组引用。它是一个表达式,它获取一个切片buffer并将其分配给一个新的未命名变量,您的函数会打印该变量的 ID,然后将其丢弃。然后buffer[1:3]做了类似的事情,新的未命名变量巧合地被分配到与现在消失的副本相同的内存位置buffer[3:4],因为 Python 的垃圾收集知道该位置是空闲的。

如果您在创建切片后不丢弃切片,它们将被分配到不同的位置。尝试这个:

>>> b34 = buffer[3:4]
>>> b13 = buffer[1:3]
>>> b34
<memory at 0x0000024E65662940>
>>> b13
<memory at 0x0000024E65662A00>

在这种情况下,它们位于不同的位置,因为存在同时引用它们的变量。

两者都位于不同的位置,buffer因为它们都是 3 个不同的变量,它们仅在历史上相互关联,因为它们的创建方式。

Python 变量不是可以用指针索引的原始内存块,并且认为可以像 C 字节数组一样直接访问它们是没有帮助的。一个特定的 Python 解释器如何处理你的数据,这通常不是 Python 程序员的事。在应用程序级别,为什么有人要关心buffer[3:4]存储的位置和方式?

有一个很好的理由:如果您有大量数据,您可能需要了解实现的细节,因为您有性能问题。但通常应用程序级别的解决方案是使用模块,array或者pandas非常聪明的人已经考虑过这些问题并提出解决方案。

您要问的不是关于 Python 的问题,而是关于特定 CPython 实现的细节的问题。如果你对这类事情感兴趣,而且没有理由不感兴趣,你可以随时去阅读源代码。但这目前可能有点过于雄心勃勃。


推荐阅读