在python中使用pandas或dask高效地读取大型csv文件

2024-05-20 14:09:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我想以最快的方式将大型csv文件读入python。我有一个大约1亿行的csv文件。我偶然发现了这本初级读物https://medium.com/casual-inference/the-most-time-efficient-ways-to-import-csv-data-in-python-cc159b44063d,他们看了几个包

  1. csv文件
  2. 熊猫
  3. 达斯克
  4. 数据表
  5. 副词

就我而言,“csv”太原始了,我想利用其他包中包含的类型推断。我需要它在windows和linux机器上都能工作,并且也研究了datatable和paratext,但是在安装正确的包依赖项时遇到了问题(anaconda包repo上也没有)。所以就剩下熊猫和达斯克了。乍一看,dask似乎快得多,但我才意识到,它只在调用“.compute”时才进行计算

我的具体用例是,即使原始csv文件有1亿多行,我也只需要将其中的一个子集加载到内存中。例如,所有date>;=T的行。有没有比下面的示例更有效的方法?熊猫和达斯克花的时间都差不多。你知道吗

编辑:csv文件每天更新,并且没有预先知道的文件行顺序。即最近日期不一定在文件末尾

import pandas as pd
import dask as dd
from datetime import datetime

s = datetime.now()
data1 = pd.read_csv("test.csv", parse_dates=["DATE"])
data1 = data1[data1.DATE>=datetime(2019,12,24)]
print(datetime.now()-s)

s = datetime.now()
data2 = dd.read_csv("test.csv", parse_dates=["DATE"])
data2 = data2[data2.DATE>=datetime(2019,12,24)].compute()
print(datetime.now()-s)

Tags: 文件csvtestimportreaddatetimedateas
2条回答

CSV不是一种有效的过滤文件格式,CSV文件没有数据字段的索引,没有基于密钥的访问。对于每个过滤器操作,您总是必须读取所有行。你知道吗

你可以通过使用一个用C语言编写的库或者做一些比另一个库更聪明的事情来略微提高性能,但是不要期望奇迹/如果你识别/实现一个优化的C版本来读取你的行并执行初始过滤,我会期望性能提高百分之几到三倍。你知道吗

如果您更频繁地读取CSV文件,那么在第一次读取期间转换该文件可能会很有用(存在多个选项:hand craftet helpers、index、sorting、database…) 并对“数据库”执行后续读取。你知道吗

如果您知道新的CSV文件与以前的版本加上附加到文件末尾的行相同,则必须记住以前版本的最后一行的位置,并将新行添加到优化的数据文件中。(数据库…)

其他文件格式的效率可能要高出几百倍或几千倍,但第一次创建这些文件的成本可能至少与您的搜索一样高(因此,如果只读取一次,就没有什么可以优化的)

如果以上条件都不成立,那么您就不能期望性能得到巨大提高

你可以看看What is the fastest way to search the csv file?

对于加速(假设文件可以按搜索/筛选条件进行排序/索引)

你的Dask解决方案在我看来不错。特别是对于解析CSV,您可能需要使用Dask的多处理调度器。大多数panda操作使用线程更好,但是基于文本的处理(如CSV)是一个例外。你知道吗

data2 = data2[data2.DATE>=datetime(2019,12,24)].compute(scheduler="processes")

有关详细信息,请参见https://docs.dask.org/en/latest/scheduling.html。你知道吗

相关问题 更多 >