Fastest way to parse large CSV files in Pandas
我在这里使用熊猫分析大数据文件:http://www.nielda.co.uk/betfair/data/它们的大小约为100兆。
来自csv的每个负载需要几秒钟,然后有更多时间来转换日期。
我已经尝试加载文件,将日期从字符串转换为日期时间,然后将它们重新保存为pickle文件。 但加载它们也需要几秒钟。
我可以使用哪些快速方法从磁盘加载/保存数据?
-
This Websense category is filtered: Adult Material. URL: http://www.nielda.co.uk/betfair/data哦,jeez,请告诉我刚刚点击的内容。
-
只是一个猜测,但也许csv.reader比Pandas更有效解析。
-
我对酸洗pandas数据框的体验是它不比加载具有相同内容的CSV文件快。 您是否尝试过使用pd.read_csv的parse_dates选项?
-
您在加载期间或之后转换为日期时间吗? 你应该能够在读取它们时转换列,我希望pandas能够非常有效地读取csvs,至于存储也许你应该考虑pytables / hdf5?
-
crclayton - 数据包含betfair赛马的历史数据。 那里没有顽皮的材料。
-
"我可以用什么快速方法从磁盘加载/保存数据?" 我不知道这是否适用于您的用例,但您是否调查过PyTables? 它非常快速地加载数据并与numpy很好地接口。 但是不知道Panda。
正如@chrisb所说,pandas'read_csv可能比csv.reader/numpy.genfromtxt/loadtxt更快。我不认为你会找到更好的解析csv(作为一个注释,read_csv不是'纯python'解决方案,因为CSV解析器是用C实现的)。
但是,如果您必须经常加载/查询数据,解决方案是仅解析CSV一次,然后将其存储为另一种格式,例如HDF5。您可以使用pandas(在后台使用PyTables)来有效地查询(docs)。
请参阅此处,了解HDF5,csv和SQL与pandas的io性能:http://pandas.pydata.org/pandas-docs/stable/io.html#performance-considerations
还有一个可能相关的问题:"大数据"工作流程使用大熊猫
-
HDF5的另一个替代方案是保存NumPy阵列。 然后加载它只是将二进制流加载到内存中,没有解析或任何额外的操作。 使用memmap开销为零(但根据应用程序,可能在尾部仍然加载时可以在头部执行计算,然后memmap不是一个好的解决方案)。 另一方面,如果HDF5足够快,它是标准格式,应该是首选。
要检查的一件事是磁盘系统本身的实际性能。特别是如果您使用旋转磁盘(而不是SSD),您的实际磁盘读取速度可能是性能的解释因素之一。因此,在进行太多优化之前,请检查是否将相同的数据读入内存(例如,mydata = open('myfile.txt').read())需要相等的时间。 (只是确保你不会被磁盘缓存所困扰;如果你加载相同的数据两次,第二次它会快得多,因为数据已经在RAM缓存中了。)
在相信我在下面写的内容之前,请参阅下面的更新
如果您的问题是真正解析文件,那么我不确定是否有任何纯Python解决方案可以帮助您。如您所知,文件的实际结构,您不需要使用通用的CSV解析器。
但是,有三件事要尝试:
Python csv包和csv.reader
NumPy genfromtext
Numpy loadtxt
如果你可以将它与数据一起使用,第三个可能是最快的。同时它具有最有限的功能集。 (这实际上可以使它快速。)
此外,crclayton,BKay和EdChum在评论中给出的建议也很好。
尝试不同的选择!如果它们不起作用,那么你将不得不用编译语言编写一些东西(编译Python或者例如C)。
更新:我确实相信下面的chrisb,即pandas解析器很快。
然后,使解析更快的唯一方法是用C(或其他编译语言)编写特定于应用程序的解析器。 CSV文件的通用解析并不简单,但如果知道文件的确切结构,则可能存在快捷方式。在任何情况下,解析文本文件都很慢,所以如果你能将它翻译成更可口的东西(HDF5,NumPy数组),加载将仅受I / O性能的限制。
-
对于它的价值,pandas csv解析器比这三者中的任何一个快得多。
-
@chrisb:谢谢你的纠正,我没有任何基准。 我修改了我的答案,所以如果你给它-1,你可以考虑删除它。 (-1是当之无愧的,我不是在抱怨。)
-
Pandas csv解析器并不快。 需要> 2天才能解析30gb文件。