mol*_*arg 9 python memory memoryview
我在内存中有一个碎片结构,我想将它作为一个连续的内存视图来访问它.有没有一种简单的方法可以做到这一点,还是应该实现自己的解决方案?
例如,考虑由记录组成的文件格式.每条记录都有一个固定长度的标题,用于指定记录内容的长度.更高级别的逻辑结构可能分布在多个记录中.如果它可以将它自己的碎片内存位置视为一个简单的连续字节数组,那么它将使更高级别的结构更容易实现.
更新:
似乎python在内部支持这种"分段"缓冲区类型,至少基于文档的这一部分.但这只是C API.
UPDATE2:
据我所知,引用的C API - 称为旧式缓冲区 - 可以满足我的需求,但现在已经弃用,并且在较新版本的Python(3.X)中不可用.新的缓冲协议 - 在PEP 3118中指定- 提供了一种表示缓冲区的新方法.这个API在大多数用例中更有用(其中,表示缓冲区在内存中不连续的用例),但不支持这个特定的用例,其中一维数组可以完全自由地布局(多个不同)记忆中的大小块.
小智 2
首先 - 我假设你只是想在纯 python 中而不是在 ac 扩展中执行此操作。因此,我假设您已将您感兴趣的不同记录加载到一组 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
Run Code Online (Sandbox Code Playgroud)
当然,您仍然需要知道记录中的高级结构要正确地对数组进行切片,但无论如何您都需要知道这一点。
编辑:
请注意,获取列表的切片不会复制列表中的数据,它只是创建一组新的数据引用,因此:
>>> a = [1,2,3]
>>> b = a[1:3]
>>> id(a[1])
140268972083088
>>> id(b[0])
140268972083088
Run Code Online (Sandbox Code Playgroud)
然而,对列表 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
Run Code Online (Sandbox Code Playgroud)
当然,这不是做您所希望的事情的简单方法,但它应该可以满足您的需要。