10

我在内存中有一个零散的结构,我想将它作为一个连续的内存视图来访问。有没有一种简单的方法可以做到这一点,或者我应该实施自己的解决方案?

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

更新:

至少基于文档的这一部分,python 似乎在内部支持这种“分段”缓冲区类型。但这只是 C API。

更新2:

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

4

1 回答 1

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

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

编辑

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

>>> 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

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

于 2013-12-22T13:08:35.710 回答