我想以最快的方式将大型csv文件读入python。我有一个大约1亿行的csv文件。我遇到了这个初级的https://medium.com/casual-inference/the-most-time-efficient-ways-to-import-csv-data-in-python-cc159b44063d,他们经过了几个包
就我的目的而言,"csv“太原始了,我想利用其他包中包含的类型推断。我需要它同时在windows和linux机器上工作,我还研究过datatable和paratext,但是在安装正确的包依赖项(它们都不在anaconda package repo上)时遇到了问题。所以只剩下熊猫和达斯克了。乍一看,达斯克看起来要快得多,但我只意识到只有当你叫".compute“时,它才能进行计算。
我的具体用例是,尽管原始csv文件是100+百万行,但我只需要将其中的一个子集加载到内存中。例如,拥有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)发布于 2020-01-02 17:43:38
我觉得你的Dask解决方案不错。特别是对于解析CSV,您可能需要使用Dask的多进程调度程序。大多数Pandas操作更适合使用线程,但基于文本的处理(如CSV )是一个例外。
data2 = data2[data2.DATE>=datetime(2019,12,24)].compute(scheduler="processes")发布于 2020-01-02 15:48:07
CSV不是一种有效的过滤文件格式,CSV文件没有数据字段的索引,没有基于密钥的访问。对于每个筛选器操作,您总是必须读取所有行。
您可以通过使用用C编写的库或比另一个库稍微聪明一些的库来稍微提高性能,但是不要期望奇迹/如果您识别/实现了一个优化的C版本,读取您的行并执行初始筛选,那么它的性能会提高几%到3倍。
如果您更频繁地读取CSV文件,那么在第一次读取期间转换该文件可能是有用的(存在多个选项:手工手工艺助手、索引、排序、数据库、.)并在“数据库”上执行后续读取。
如果您知道新的CSV文件与前一个版本相同,加上附加到文件末尾的行,则必须记住前一个版本最后一行的位置,只需将新行添加到优化的数据文件中。(数据库.)
其他文件格式的效率可能要高出数百或数千倍,但第一次创建这些文件的代价可能至少与搜索一样昂贵(因此,如果只读取一次,则无法优化)。
如果上述任何条件都不是真的,您就不能指望会有巨大的性能提高。
你可以看看What is the fastest way to search the csv file?
对于加速(假设文件可以按照搜索/筛选标准排序/索引)
https://stackoverflow.com/questions/59565266
复制相似问题