用Python处理大量数据

7
我一直在尝试处理大量数据(几个GB),但我的个人电脑无法在合理的时间范围内完成,所以我想知道我有哪些选项?我使用了Python的csv.reader,但即使获取20万行也非常缓慢。然后我将这些数据迁移到了一个sqlite数据库,它检索结果更快,而且不消耗太多内存,但速度仍然是一个主要问题。
那么,再次问一遍...我有哪些选项来处理这些数据?我想使用Amazon的spot instances,它似乎很适合这种情况,但也许还有其他解决方案需要探索。
假设抢占式实例是一个不错的选择,考虑到我以前从未使用过它们,我想问一下可以从中期望什么?有没有人在这方面有经验?如果有,你的工作流程是什么?我认为我可以找到一些详细介绍科学计算、图像处理或类似事情的工作流程的博客文章,但我没有找到任何东西,如果你能解释一下或指出一些链接,我会非常感激。

先行致谢。


2
在我看来,从时间角度来看,本地处理几GB的数据肯定比学习、编码、部署和在其他地方处理要快得多。慢速代码就是慢速代码,无论它在你的机器上还是在其他地方,而且跨机器分配工作会增加更多的复杂性。EMR可以缓解很多痛苦,但仍然有一些问题。 - willglynn
2
瓶颈在哪里——是在读取数据的过程中,还是在代码算法部分的某个地方? - ev-br
Python并不被认为是一种快速的编程语言。将其用于处理大量数据听起来像是一个糟糕的主意。 - Don Reba
如果您正在进行在线处理而不是尝试将所有数据都放入内存中,那么读取记录的速度将随记录数量线性增长。除非您需要重复运行此处理,否则即使需要一些时间,您也应该能够在本地计算机上完成它。 - Qnan
1
你是否打算多次使用这些数据?将数据读取并保存为二进制格式可能会更有益,因为以后可以更快地读取和操作。转换可能需要相当长的时间,因此仅在整个数据被访问多次时才有用。 - Mickey Diamant
显示剩余6条评论
2个回答

10
我会尝试使用 numpy 来处理您的大型数据集。与 csv.reader 相比,Numpy 数组应该使用更少的内存,并且使用矢量化的 numpy 函数计算速度应该更快。
但是,在读取文件时可能会出现内存问题。numpy.loadtxtnumpy.genfromtxt 在读取文件时也会消耗大量内存。 如果这是一个问题,一些(全新的)替代解析器引擎在此处进行了比较。根据这篇文章,建立在 Numpy 之上的新 pandas(库)解析器似乎是一个选项。
如评论中所提到的,当您读取文件后,我建议您将数据以二进制格式(例如HDF5)存储。从我的经验来看,从HDF5文件加载数据非常快(有趣的是,在您的情况下,它与sqlite相比速度如何)。我知道将数组保存为HDF5的最简单方法是使用pandas。
import pandas as pd

data = pd.read_csv(filename, options...)
store = pd.HDFStore('data.h5')
store['mydata'] = data
store.close()

加载您的数据就像这样简单

import pandas as pd

store = pd.HDFStore('data.h5')
data = store['mydata']
store.close()

 

非常好的答案。我之前没有使用过pandas,但我很期待学习它。在接受这个答案之前,我会等待几天,但这看起来非常令人满意。非常感谢! - r_31415

1

有趣。我还没有深入研究过Map Reduce任务,但我会去了解一下。谢谢! - r_31415

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接