Python dask Parralize能否读取csv文件?
我正在将一个大的文本文件转换成hdf存储器,希望能更快地访问数据。转换工作正常,但是从csv文件读取不是并行完成的。它非常慢(SSD上1GB的文本文件大约需要30分钟,所以我猜它不受IO限制) 有没有办法让它在parralel中多线程读取? 尽管这可能很重要,但我目前被迫在Windows下运行——以防万一,这会有什么不同Python dask Parralize能否读取csv文件?,python,csv,pandas,dask,Python,Csv,Pandas,Dask,我正在将一个大的文本文件转换成hdf存储器,希望能更快地访问数据。转换工作正常,但是从csv文件读取不是并行完成的。它非常慢(SSD上1GB的文本文件大约需要30分钟,所以我猜它不受IO限制) 有没有办法让它在parralel中多线程读取? 尽管这可能很重要,但我目前被迫在Windows下运行——以防万一,这会有什么不同 from dask import dataframe as ddf df = ddf.read_csv("data/Measurements*.csv",
from dask import dataframe as ddf
df = ddf.read_csv("data/Measurements*.csv",
sep=';',
parse_dates=["DATETIME"],
blocksize=1000000,
)
df.categorize([ 'Type',
'Condition',
])
df.to_hdf("data/data.hdf", "Measurements", 'w')
是的,dask.dataframe可以并行读取。但是,您遇到了两个问题: Pandas.read_csv仅部分释放GIL 默认情况下,dask.dataframe与线程并行,因为大多数panda可以在多个线程中并行运行(释放GIL)。Pandas.read_csv是一个例外,尤其是当生成的数据帧使用对象数据类型作为文本时 dask.dataframe.to_hdf(文件名)强制进行顺序计算 写入单个HDF文件将强制进行顺序计算(很难并行写入单个文件) 编辑:新解决方案 今天我会避免使用HDF,而是使用拼花地板。我可能会使用多处理或dask.distributed调度器来避免在一台机器上出现GIL问题。这两种方法的结合应该可以实现完全的线性缩放
from dask.distributed import Client
client = Client()
df = dask.dataframe.read_csv(...)
df.to_parquet(...)
解决方案
由于数据集可能适合内存,请使用dask.dataframe.read_csv与多个进程并行加载,然后立即切换到Pandas
import dask.dataframe as ddf
import dask.multiprocessing
df = ddf.read_csv("data/Measurements*.csv", # read in parallel
sep=';',
parse_dates=["DATETIME"],
blocksize=1000000,
)
df = df.compute(get=dask.multiprocessing.get) # convert to pandas
df['Type'] = df['Type'].astype('category')
df['Condition'] = df['Condition'].astype('category')
df.to_hdf('data/data.hdf', 'Measurements', format='table', mode='w')
借助@MRocklin的答案,在较新版本的dask中,您可以使用
df.compute(scheduler='processes')
或df.compute(scheduler='threads')
使用多处理或多线程转换为熊猫:
from dask import dataframe as ddf
df = ddf.read_csv("data/Measurements*.csv",
sep=';',
parse_dates=["DATETIME"],
blocksize=1000000,
)
df = df.compute(scheduler='processes') # convert to pandas
df['Type'] = df['Type'].astype('category')
df['Condition'] = df['Condition'].astype('category')
df.to_hdf('data/data.hdf', 'Measurements', format='table', mode='w')
我们在非dask应用程序中也遇到了类似的问题——从csv文件创建多个块并并行读取它们相对容易。请记住,每一行都是一条有效的记录。我希望以后能够从hdf5文件中读取数据,从而超越基于文本的csv文件,这一期望能够实现。非常感谢,我对dask感到非常兴奋。你能从两个方面扩展这个答案吗?首先,我的.csv无法放入内存。其次,可能更复杂的是,.csv文件是压缩的,目前Dask不支持该文件。本讨论()中有指向
Dask.delayed
的指针,但我不确定如何将其与pd.read\u csv
和chunksize
结合使用。谢谢你好@mgoldwaser,回答得好。这两个选项-进程
与线程
(就在一台机器上运行而言)之间的区别是什么?Hi@edesz-线程共享内存,并受GIL(全局解释器锁)的约束,而进程作为单独的进程运行,并具有额外的开销。通常,由于GIL的限制,多线程在Python中不能很好地工作,除非任务是IO绑定的(例如,如果每个任务下载一个文件)。如果您不确定,请尝试这两种方法,看看哪一种更快。