如何处理大量数据?

时间:2016-11-03 07:02:50

标签: python

我需要在我的程序中处理大量数据(例如float),这会花费我很多内存。另外,我创建了一些数据结构来组织我的数据,这也会耗费内存。

以下是示例:

Heap at the end of the function Partition of a set of 6954910 objects. Total       size = 534417168 bytes.

Index  Count   %     Size   % Cumulative  % Kind (class / dict of class)
0 3446006  50 248112432  46 248112432  46 array.array
1 1722999  25 124055928  23 372168360  70 vertex.Vertex
2 574705   8 82894088   16 455062448  85 list
.......

任何解决方案?

2 个答案:

答案 0 :(得分:1)

Python支持内部维护在简单数据的压缩二进制数组中的array个对象。

例如

import array
a = array.array('f', 0. for x in range(100000))

将创建一个包含100,000个浮点数的array对象,其大小约为400Kb(每个元素4个字节)。

当然,您只能在数组对象中存储特定类型的值,而不是像常规list对象那样存储任何Python值。

numpy模块扩展了这个概念,为您提供了许多快速操作此类多维数据结构的方法(包括将数组的一部分视为共享相同内存的数组,重新整形数组,执行数学和搜索操作以及更多)。

答案 1 :(得分:0)

如果你每天需要处理数十亿行数据,到目前为止最简单的方法是创建一个简单的索引器脚本,根据某些键将数十亿行分成小文件(例如第一行)日志文件行中IP地址的两位数字)。

如果您需要处理数字理论,日志文件或其他具有大量整数或浮点数的内容:

1)学会好好使用Numpy数组

2)开始使用Numba的即时编译

3)学习Cython(你可以做比Numba更多的事情)

至少中等水平的linux技能在处理大量数据方面是一个巨大的优势。有些事情需要几秒钟直接从命令行完成,而在python中如何做同样的事情可能根本不明显。

至少使用%timeit来测试达到所需比例的比例范围(例如每天25亿行)。这是一种识别可能性能下降,并相应减小阵列大小或其他因素的简便方法。

只要您对数据执行某些操作,就可以了解有关分析/性能黑客攻击的更多信息。

指出关于' indexer' clear,一个非常简单的示例索引器我已经创建并用于使用每月60美元的服务器对包含数十亿行数据的文件进行大量计算。

https://github.com/mikkokotila/indexer