用例如下:
我一直在尝试在内存中执行第二步(无需将文件存储到磁盘即可获得拼花格式),但是到目前为止,我所见过的所有库始终将它们写入磁盘。
所以我有以下问题:
答案 0 :(得分:1)
Apache Arrow和pyarrow库应该解决此问题,并在内存中进行很多处理。在pandas
中,您可以通过pyarrow
读取/写入镶木地板文件。
一些示例代码也利用了smart_open。
import pandas as pd
import boto3
from smart_open import open
from io import BytesIO
s3 = boto3.client('s3')
# read parquet file into memory
obj = s3.get_object(Bucket=bucket, Key=key)
df = pd.read_parquet(BytesIO(obj['Body'].read()), engine='pyarrow')
# do stuff with dataframe
# write parquet file to s3 out of memory
with open(f's3://{outputBucket}/{outputPrefix}{additionalSuffix}', 'wb') as out_file:
df.to_parquet(out_file, engine='pyarrow', index=False)
答案 1 :(得分:0)
如果转换是在内存中完成的,因为您不必处理I / O磁盘开销,会不会有更好的表现?
是的,会的。为此,您可以使用BytesIO
对象(或StringIO
),该对象可以代替文件描述符使用。如果您使用的是pyarrow,则有NativeFile
。
随着您增加将文件转换并将其存储到磁盘的并发进程,我们难道就不会遇到磁盘问题,例如某些时候空间不足或达到磁盘的吞吐量限制吗?
也是如此,但这是对文件系统(包括数据库)的任何读/写的限制。通过确保在处理完文件后将其删除,可以节省磁盘空间。另外,除非您要处理大量磁盘数据或SQL语句,否则您很可能会在达到磁盘吞吐量限制之前达到带宽限制。
...但是到目前为止我所见过的所有库,它们总是写入磁盘。
除非函数明确需要一个“文件名”,否则您可以如上所述用缓冲区对象替换文件指针(fp
)。