很容易实现struct for memory有效的元组列表

时间:2011-06-29 11:22:58

标签: python memory

我需要创建以下类型的列表

[(latitude, longitude, date), ...]

其中纬度和经度是浮点数,而日期是整数。我的本地机器上的内存不足,因为我需要存储大约6000万个这些元组。在python中表示这些元组的最大内存效率(同时又简单易用)是什么?

纬度和经度的精度不需要那么大(足以表示诸如-65.100234之类的值),并且整数需要足够大才能处理UNIX时间戳。

之前我使用swig来定义“c-structs”,它们通常比python更有效,但实现起来很复杂...可能有一些scipy或numpy方式声明这样的元组使用较少记忆......任何想法?

1 个答案:

答案 0 :(得分:3)

如果您使用NumPy就可以了,可以使用numpy.recarray。如果你想要坐标的8位有效数字,单精度浮点数可能还不够,所以你的记录将有两个双精度浮点数和一个32位整数,总共20个字节,所以6000万条记录需要1.2 GB记忆请注意,NumPy数组具有固定大小,如果大小更改,则需要重新分配。

代码示例:

# Create an uninitialised array with 100 records
a = numpy.recarray(100,
                   formats=["f8", "f8", "i4"],
                   names=["latitude", "longitude", "date"])
# initialise to 0
a[:] = (0.0, 0.0, 0)
# assign a single record
a[0] = (-65.100234, -38.32432, 1309351408)
# access the date of the first record
a[0].date
# access the whole date column
a.date

如果你想避免对NumPy的依赖,你也可以使用ctypes ctypes个数组,这些数组不如NumPy数组方便,但比使用SWIG更方便。