我正在使用熊猫和木星笔记本。我正在读取700MB的CSV文件,加载需要69秒。出于测试目的,这是可以接受的,因为我只需要加载一次,并且在笔记本实例的整个过程中它会保留在内存中。
pd.read_csv(path, names=['Date','Time','Seconds','Counts','Pressure'], dtype='unicode')
我试图使用与python可执行文件相同的代码,这使得测试真的很困难,因为每次对程序进行更改时,我都需要等待69秒才能加载数据。我该如何加快读取CSV文件的速度?
答案 0 :(得分:4)
您可以为此目的使用dask
module:
import dask.dataframe
data = dask.dataframe.read_csv("your.csv")
Dask比普通的熊猫read_csv
快得多,因为它利用了并行处理并且不会将整个数据加载到内存中。该article from Eric Brown是对其潜在用途的很好入门。
答案 1 :(得分:2)
您可以使用
使用镶木地板格式df.to_parquet('file.parquet')
pd.read_parquet('file.parquet')
您将需要安装fastparquet
或pyarrow
软件包。
请注意,并不是所有的Python类型都可以理解,因此您需要数据具有标准类型,例如numpy dtypes。
答案 2 :(得分:1)
我在这里看到了多种选择:
nrows
中指定pd.read_csv
参数。dtype
参数为要解析的所有列和/或要解析的日期指定parse_dates
参数。 parquet
或feather
格式,将来这些格式将更快地加载-它们都需要pyarrow
安装,如前所述。答案 3 :(得分:1)
在此处放置另一种可能的解决方案,不需要其他软件包。
基本上,只有您第一次真正解析整个CSV;然后将解析数据的压缩副本保存在磁盘上。从第二次开始,您仅加载缓存。
这可能会节省时间,因为解压缩会占用大量CPU,但是磁盘上的压缩文件会更小。
类似的东西:
import tempfile
from pathlib import Path
import numpy as np
def lazy_read(path, force_reload=False):
cache = Path(tempfile.gettempdir()) / 'mycache.npz'
if cache.is_file() and not force_reload:
print('Loading from cache...', end=' ')
data = np.load(cache)['data']
else:
print('Reading file...', end=' ')
data = pd.read_csv(path, names=['Date','Time','Seconds','Counts','Pressure'], dtype='unicode')
np.savez_compressed(cache, data=data)
print('Done.')
return data
if __name__ == '__main__':
lazy_read(path)
答案 4 :(得分:0)
您可以使用模块Modin
它是一个可以与dask和ray一起使用的库,它的功能与熊猫相同。您可以轻松地从Modin数据框转到pandas数据框并使用pandas函数。
该模块仍在积极开发中