ds.read_file() 在返回时会把整个文件下载到内存中吗,还是返回一个支持按行组进行惰性访问的句柄?
在Dash Enterprise应用中读取来自S3数据源的大型Parquet文件时,我遇到了 内存溢出(OOM) 错误。我的当前代码大致如下:
python
from dash_enterprise_libraries import data_sources as ds
import pyarrow.parquet as pq
""" DATA_SOURCE a connector within dash enterprise to to securely store credintials and connect to respective data source """
file_handle = ds.read_file(path, DATA_SOURCE)
table = pq.read_table(file_handle, columns=columns, filters=filter_expr)
我注意到代码在第二次读取前执行了 file_handle.seek(0),这表明 ds.read_file() 返回了一个 内存缓冲区(类似于 BytesIO),而不是一个惰性/流式文件句柄。
我的问题: ds.read_file() 会在返回前将整个文件下载到内存中吗,还是它返回一个支持惰性按行组访问的句柄——以便pyarrow的 filters= 可以下推谓词,从而避免从S3下载不必要的数据?
解决方案
因此,你的代码会把文件下载到内存中,然后再传递给pq.read_table
在这段代码中并没有使用延迟加载。来自S3的文件将不得不被下载到内存,除非你在使用S3的流式服务。在你的情况下,你并不是以流的方式进行读取。
希望这对你有帮助。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。