gpt4 book ai didi

python - 如何为不连续的内存位置创建内存 View ?

转载 作者:IT王子 更新时间:2023-10-28 23:36:31 27 4
gpt4 key购买 nike

我在内存中有一个碎片结构,我想将它作为一个连续的内存 View 来访问。有没有一种简单的方法可以做到这一点,还是我应该实现自己的解决方案?

例如,考虑一种由记录组成的文件格式。每条记录都有一个固定长度的 header ,它指定记录内容的长度。更高级别的逻辑结构可能分布在多个记录上。如果它可以将自己的碎片内存位置视为一个简单的连续字节数组,它将更容易实现更高级别的结构。

更新:

似乎python在内部支持这种“分段”缓冲区类型,至少基于this part of the documentation .但这只是 C API。

更新2:

据我所知,引用的 C API(称为旧式缓冲区)可以满足我的需要,但它现在已被弃用,并且在较新版本的 Python (3.X) 中不可用。新的缓冲协议(protocol)——在 PEP 3118 中指定- 提供了一种表示缓冲区的新方法。此 API 在大多数用例中更有用(其中,表示的缓冲区在内存中不连续的用例),但不支持这个特定的一个,其中一维数组可以完全自由地布局(多个不同的大小的 block )在内存中。

最佳答案

首先 - 我假设您只是想在纯 python 中而不是在 c 扩展中执行此操作。因此,我假设您已将您感兴趣的不同记录加载到一组 python 对象中,而您的问题是您希望看到分布在这些对象中的更高级别的结构,并且在整个对象中到处都有位。

那么你不能简单地将每条记录加载到字节数组类型中吗?然后,您可以使用数组的 python 切片创建一个新数组,其中仅包含您感兴趣的高级结构的数据。然后,您将拥有一个仅包含您感兴趣的数据的单字节数组,并且可以将其打印出来或以任何你想要的方式操纵它。

比如:

a = bytearray(b"Hello World") # put your records into byte arrays like this
b = bytearray(b"Stack Overflow")
complexStructure = bytearray(a[0:6]+b[0:]) # Slice and join arrays to form
# new array with just data from your
# high level entity
print complexStructure

当然,您仍然需要知道您的高级结构在记录中的哪个位置正确地对数组进行切片,但无论如何您都需要知道这一点。

编辑:

注意获取列表的一部分并不会复制列表中的数据,它只会创建一组新的数据引用,因此:

>>> a = [1,2,3]
>>> b = a[1:3]
>>> id(a[1])
140268972083088
>>> id(b[0])
140268972083088

但是,对列表 b 的更改不会更改 a,因为 b 是一个新列表。要使原始列表中的更改自动更改,您需要创建一个更复杂的对象,其中包含原始记录的列表并以能够决定要更改的列表和列表的哪个元素的方式隐藏它们或在用户希望修改/查看复杂结构时查看。所以像:

class ComplexStructure():
def add_records(self,record):
self.listofrecords.append(record)

def get_value(self,position):
listnum,posinlist = ... # formula to figure out which list and where in
# list element of complex structure is
return self.listofrecords[listnum][record]

def set_value(self,position,value):
listnum,posinlist = ... # formula to figure out which list and where in
# list element of complex structure is
self.listofrecords[listnum][record] = value

当然,这不是做你希望做的事情的简单方法,但它应该做你需要的。

关于python - 如何为不连续的内存位置创建内存 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20565339/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com