Python dask Parralize能否读取csv文件?

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",

我正在将一个大的文本文件转换成hdf存储器,希望能更快地访问数据。转换工作正常,但是从csv文件读取不是并行完成的。它非常慢(SSD上1GB的文本文件大约需要30分钟,所以我猜它不受IO限制)

有没有办法让它在parralel中多线程读取? 尽管这可能很重要,但我目前被迫在Windows下运行——以防万一,这会有什么不同

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绑定的(例如,如果每个任务下载一个文件)。如果您不确定,请尝试这两种方法,看看哪一种更快。