如何使用 fsspec+adlfs 加快从 adl:// 读取 CSV/Parquet 文件的速度?
How can I speed up reading a CSV/Parquet file from adl:// with fsspec+adlfs?
我有一个几千兆字节的 CSV 文件驻留在 Azure Data Lake 中。使用 Dask,我可以在一分钟内读取这个文件,如下所示:
>>> import dask.dataframe as dd
>>> adl_path = 'adl://...'
>>> df = dd.read_csv(adl_path, storage_options={...})
>>> len(df.compute())
但是,我不想将其读入 Dask 或 Pandas DataFrame——我想直接访问底层文件。 (目前它是 CSV,但我也希望能够处理 Parquet 文件。)所以我也在尝试使用 adlfs 0.2.0:
>>> import fsspec
>>> adl = fsspec.filesystem('adl', store_name='...', tenant_id=...)
>>> lines = 0
>>> with adl.open(adl_path) as fh:
>>> for line in fh:
>>> lines += 1
在与 Dask 进程相同的时间内,此方法仅读取了 0.1% 的输入。
我尝试过使用 fsspec
的缓存,认为这会在 the initial caching 完成后加快访问速度:
>>> fs = fsspec.filesystem("filecache", target_protocol='adl', target_options={...}, cache_storage='/tmp/files/')
>>> fs.exists(adl_path) # False
>>> fs.size(adl_path) # FileNotFoundError
>>> # Using a relative path instead of fully-qualified (FQ) path:
>>> abs_adl_path = 'absolute/path/to/my/file.csv'
>>> fs.exists(abs_adl_path) # True
>>> fs.size(abs_adl_path) # 1234567890 -- correct size in bytes
>>> fs.get(abs_adl_path, local_path) # FileNotFoundError
>>> handle = fs.open(abs_adl_path) # FileNotFoundError
有没有一种高效的方法可以像普通 Python 文件句柄一样远程读取 CSV(以及 Parquet)而无需先将 作为 Dask DataFrame 加载?
我不知道为什么 fs.get
不起作用,但请在最后一行试试这个:
handle = fs.open(adl_path)
即,您 打开 原始路径,但您在“/tmp/files/”中的某处获得本地文件的文件句柄(一旦复制完成) .
我有一个几千兆字节的 CSV 文件驻留在 Azure Data Lake 中。使用 Dask,我可以在一分钟内读取这个文件,如下所示:
>>> import dask.dataframe as dd
>>> adl_path = 'adl://...'
>>> df = dd.read_csv(adl_path, storage_options={...})
>>> len(df.compute())
但是,我不想将其读入 Dask 或 Pandas DataFrame——我想直接访问底层文件。 (目前它是 CSV,但我也希望能够处理 Parquet 文件。)所以我也在尝试使用 adlfs 0.2.0:
>>> import fsspec
>>> adl = fsspec.filesystem('adl', store_name='...', tenant_id=...)
>>> lines = 0
>>> with adl.open(adl_path) as fh:
>>> for line in fh:
>>> lines += 1
在与 Dask 进程相同的时间内,此方法仅读取了 0.1% 的输入。
我尝试过使用 fsspec
的缓存,认为这会在 the initial caching 完成后加快访问速度:
>>> fs = fsspec.filesystem("filecache", target_protocol='adl', target_options={...}, cache_storage='/tmp/files/')
>>> fs.exists(adl_path) # False
>>> fs.size(adl_path) # FileNotFoundError
>>> # Using a relative path instead of fully-qualified (FQ) path:
>>> abs_adl_path = 'absolute/path/to/my/file.csv'
>>> fs.exists(abs_adl_path) # True
>>> fs.size(abs_adl_path) # 1234567890 -- correct size in bytes
>>> fs.get(abs_adl_path, local_path) # FileNotFoundError
>>> handle = fs.open(abs_adl_path) # FileNotFoundError
有没有一种高效的方法可以像普通 Python 文件句柄一样远程读取 CSV(以及 Parquet)而无需先将 作为 Dask DataFrame 加载?
我不知道为什么 fs.get
不起作用,但请在最后一行试试这个:
handle = fs.open(adl_path)
即,您 打开 原始路径,但您在“/tmp/files/”中的某处获得本地文件的文件句柄(一旦复制完成) .