我想以最快的方式将大型csv文件读入python。我有一个约1亿行的csv文件。我偶然发现了这个初级https://medium.com/casual-inference/the-most-time-efficient-ways-to-import-csv-data-in-python-cc159b44063d和他们通过几个包
- csv
1.Pandas
1.昏暗
1.数据表
1.副文本
就我的目的而言,“csv”太原始了,我想利用其他包中包含的类型推断。我需要它在windows和linux机器上工作,也研究了datatable和paratext,但在安装正确的包依赖项时遇到了问题(在anaconda包库上也没有)。所以就剩下Pandas和达斯克了。乍一看,dask似乎快得多,但我才意识到,它只做计算,如果你调用“.compute”
我的具体用例是,即使原始csv文件有1亿多行,我只需要将其中的一个子集加载到内存中。例如,所有日期>= T的行。还有比下面的例子更有效的方法吗?Pandas和dask花的时间差不多。
编辑: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)
字符串
3条答案
按热度按时间plupiseo1#
你的Dask解决方案看起来不错。对于解析CSV,您可能需要使用Dask的多处理调度程序。大多数Pandas操作使用线程更好,但基于文本的处理(如CSV)是个例外。
字符串
有关详细信息,请参阅https://docs.dask.org/en/latest/scheduling.html。
wn9m85ua2#
根据CSV中的列数,首先只读取日期列(pd.read_csv有一个“usecols”字段),然后使用它来确定哪些行包含所需的数据,然后使用“skiprows”字段跳过所有其他不需要的行,这一次实际读取CSV中的所有列。解析pandas或它的任何其他衍生产品中的所有列可能需要很长时间并使用大量内存,因此避免阅读大量实际上永远不会使用的数据将保存大量时间。
4si2a6ki3#
CSV不是用于过滤的有效文件格式,CSV文件没有数据字段的索引,没有基于键的访问。对于每个过滤操作,您总是必须读取所有行。
你可以通过使用一个用C写的库或者做一些比另一个库更聪明的事情来稍微提高性能,但是不要期待奇迹/如果你识别/实现一个优化的C版本,阅读你的行并执行初始过滤,我希望提高几个百分点到3倍。
如果您更频繁地读取CSV文件,那么在第一次读取时转换文件可能会很有用(存在多个选项:手工制作助手、索引、排序、数据库...),并在“数据库”上执行后续读取。
如果您知道新的CSV文件与以前的版本相同,加上附加到文件末尾的行,则必须记住以前版本的最后一行的位置,然后将新行添加到优化的数据文件中。(数据库,…)
其他文件格式的效率可能要高出几百或几千倍,但是第一次创建这些文件的代价可能至少和搜索一样高(所以如果只阅读一次,就没有什么可以优化的了)
如果上述条件都不成立,则不能期望性能大幅提升
您可以查看搜索csv文件的最快方法是什么?
对于加速(假设文件可以通过搜索/过滤标准进行排序/索引)