使用Python快速迭代大数据?

时间:2014-07-21 13:18:05

标签: python database

我正在对中等大小的数据(2GB,20Mio记录)进行数据分析,而在当前的机器上,它几乎不适合内存。在这台4 GB的机器上占用3GB时,Windows 7会大幅减速。我当前的大多数分析需要迭代所有记录并考虑由某些GroupID确定的记录组的属性。

如何处理此任务?我目前的方法是将其加载到SQLite中并逐行迭代。我在内存中构建组,但这也变得非常大。

我有以下想法,但也许你可以建议更好的方法:

  • 按GroupID对SQLite表进行排序,以便组合在一起
  • 以某种方式按列存储数据,以便我不必阅读所有列
  • 序列化数据以便用Python更快地解析它?

这些想法似乎很难为我结合:(我该怎么办?

(PS:硬件升级很难获得。管理员权利也很麻烦)

1 个答案:

答案 0 :(得分:1)

如果不了解更多关于数据的信息,很难说出来。你试图做的聚合,但肯定不做serialize data to parse it faster with Python - 很可能那不是问题所在。可能不是store data somehow column-wise so that I don't have to read all columns

sort SQLite table by GroupID so that groups come in together< - 这听起来不错。但是许多聚合(如计数,平均值,总和等)并不需要这样。在这种类型的聚合中,您可以简单地保存(key, aggregation)的映射,并遍历行并迭代地将它们应用于聚合(并将行抛弃)。

您目前是否正在收集属于内存组的所有行,然后进行聚合?如果是这样,您可能只需要更改代码,以便在读取行时进行聚合。

编辑:回复评论:
如果是这样,那我就去排序。如果您所做的只是排序,那么SQL可能会有些过分。也许你可以在磁盘上写出已排序的文件?一旦你这样做,你可以考虑parallilizing。基本上你将有一个进程读取已排序的文件(只要你不进行分布式处理就不想并行化),它会打包一组数据并将其发送到进程池(数量)过程应该固定到你调整的某个数字,以避免内存不足,这将完成其余的处理。

相关问题