Python 在Pandas中解析大型CSV文件的最快方法

Python 在Pandas中解析大型CSV文件的最快方法,python,pandas,Python,Pandas,我用熊猫来分析这里的大数据文件:它们的大小大约为100兆 每次从csv加载都需要几秒钟,然后需要更多的时间来转换日期 我尝试加载这些文件,将日期从字符串转换为日期时间,然后将它们重新保存为pickle文件。但是加载这些也需要几秒钟的时间 我可以使用什么快速方法从磁盘加载/保存数据?需要检查的一件事是磁盘系统本身的实际性能。特别是如果您使用旋转磁盘(而不是SSD),实际的磁盘读取速度可能是性能的解释因素之一。因此,在进行过多优化之前,请检查将相同的数据读入内存(例如,mydata=open('my

我用熊猫来分析这里的大数据文件:它们的大小大约为100兆

每次从csv加载都需要几秒钟,然后需要更多的时间来转换日期

我尝试加载这些文件,将日期从字符串转换为日期时间,然后将它们重新保存为pickle文件。但是加载这些也需要几秒钟的时间


我可以使用什么快速方法从磁盘加载/保存数据?

需要检查的一件事是磁盘系统本身的实际性能。特别是如果您使用旋转磁盘(而不是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性能的限制。

    正如@chrisb所说,pandas的
    读取/u csv
    可能比
    csv.reader/NumPy.genfromtxt/loadtxt快。我认为您不会找到更好的方法来解析csv(请注意,
    read\u csv
    不是“纯python”解决方案,因为csv解析器是用C实现的)

    但是,如果您必须经常加载/查询数据,解决方案是只解析CSV一次,然后将其存储为另一种格式,例如HDF5。您可以使用
    pandas
    (在后台使用
    PyTables
    )高效地查询()。
    有关HDF5、csv和SQL与pandas的io性能比较,请参见此处:


    还有一个可能相关的问题:

    莫丁是加州大学伯克利分校RISELab的一个早期项目,旨在促进分布式计算在数据科学中的应用。它是一个多进程数据帧库,具有与pandas相同的API,允许用户加速其pandas工作流。 莫丁在8核机器上将Pandas的查询速度提高了4倍,只需要用户在笔记本上更改一行代码

    pip install modin
    
    如果使用dask

    pip install modin[dask]
    
    通过键入导入modin

    import modin.pandas as pd
    

    它使用所有的CPU核心来导入csv文件,几乎就像熊猫一样

    此Websense类别已过滤:成人材料。网址:http://www.nielda.co.uk/betfair/data
    Oh jeez,请告诉我我刚才点击了什么。只是猜测一下,但可能会比Pandas更有效地解析。我对Packing Pandas数据帧的经验是,它并不比加载具有相同内容的CSV文件快。您是否尝试过使用pd.read\u csv的parse\u dates选项?您是在加载期间还是之后转换为datetime?你应该能够转换列,因为你阅读他们,我希望熊猫是非常有效的阅读CSV,至于存储,也许你应该考虑PyTaS/HDF5?克雷顿-数据包含历史数据为BeTalk赛马。这里没有顽皮的材料。值得一提的是,pandas csv解析器比这三个解析器中的任何一个都要快。@chrisb:谢谢你的更正,我没有任何基准测试。我修改了我的答案,所以如果你给它,1,你可以考虑删除它。(我没有抱怨,-1是应得的。)csv解析器速度不快。解析30gb文件需要2天以上的时间。HDF5的另一种选择是保存NumPy数组。然后加载它只是将二进制流加载到内存中,而无需解析或任何额外操作。使用
    memmap
    的开销为零(但根据应用程序的不同,可能会在尾部仍在加载时对头部执行计算,而
    memmap
    本身并不是一个好的解决方案)。另一方面,如果HDF5足够快,那么它是一种标准格式,应该是首选。如果你提供了一个莫丁和熊猫并排的速度测试,这将是一个更具说服力的建议。read_csvokay,我给了莫丁一次机会,但出现了错误。不是“插入式”替换:
    尝试:将modin.pandas作为pd导入,但ImportError除外:将pandas作为pd导入。。。sample=pd.read\u csv(文件路径,索引\u col='IlmnID')
    >类型错误:不支持的操作数类型为-:'str'和'int'interest。。。modin.pandas.read_csv()函数可以工作,但如果将其包装为Try/Except以捕获加载数据的一些异常情况,则会出现此TypeError(即使我的Except只是查找ValueError)。莫丁有点傻