我正在尝试使用s3从一个非常大的文件中读取数据...
import pandas as pd
import s3fs
df = pd.read_csv('s3://bucket-name/filename', chunksize=100000)
即使给出块大小,它仍然需要很长时间。当从S3获取文件时,chunksize
选项是否有效?如果无效,则有没有更好的方式在S3中加载大文件?
我正在尝试使用s3从一个非常大的文件中读取数据...
import pandas as pd
import s3fs
df = pd.read_csv('s3://bucket-name/filename', chunksize=100000)
即使给出块大小,它仍然需要很长时间。当从S3获取文件时,chunksize
选项是否有效?如果无效,则有没有更好的方式在S3中加载大文件?
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html 明确指出
filepath_or_bufferstr,path object或file-like object。任何有效的字符串路径都可以接受。该字符串可以是URL。有效的URL方案包括http、ftp、s3、gs和file。对于文件URL,期望有主机名。本地文件可以是:file://localhost/path/to/table.csv。
如果你想传递一个路径对象,pandas接受任何os.PathLike。
通过文件类对象,我们指的是具有read()方法的对象,例如文件句柄(例如通过内置的open函数)或StringIO。
当读取分块时,pandas会返回一个迭代器对象,您需要遍历它。例如:
for df in pd.read_csv('s3://<<bucket-name>>/<<filename>>',chunksize = 100000):
process df chunk..
如果你认为是因为块大小较大,可以考虑仅对第一个块进行尝试,使用小的块大小,例如:
for df in pd.read_csv('s3://<<bucket-name>>/<<filename>>',chunksize = 1000):
print(df.head())
break
def process_result_s3_chunks(bucket, key, chunksize):
csv_obj = s3.get_object(Bucket=bucket, Key=key)
body = csv_obj['Body']
for df in pd.read_csv(body, chunksize=chunksize):
process(df)
- nom-mon-ir