python - 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)
解决方案
回答问题 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 实现的细节的问题。如果你对这类事情感兴趣,而且没有理由不感兴趣,你可以随时去阅读源代码。但这目前可能有点过于雄心勃勃。
推荐阅读
- mysql - 错误显示使用 vb.net 在 MySQL 中是否存在重复记录
- youtube-iframe-api - 是否可以将打开的成绩单与 youtube 视频一起嵌入网站中?
- curl - 无法使用 CURL 将任何 SSML 标记应用于 IBM Watson 的文本到语音系统中的文本
- python - Pandas/Python:如何将重复的行转置为列并保持顺序?
- python - 无法在python中查询集合的firebase文档
- python - 如何从存储在数组中的文件路径中删除重复元素
- bash - 如何在终端中循环运行 ffmpeg 以使用每个子目录中的文件生成视频
- go - 如何在接收器方法中使用自定义类型的切片
- c - 为什么 yyerror() 被调用两次?
- javascript - 我得到错误:即使我创建了清理,也无法对未安装的组件执行 React 状态更新