Jav*_*low 7 python performance memory-management pandas parquet
用例如下:
我一直在尝试在内存中执行第二步(无需将文件存储到磁盘以获得镶木地板格式),但到目前为止我看到的所有库,它们总是写入磁盘。
所以我有以下问题:
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)
Run Code Online (Sandbox Code Playgroud)
如果转换在内存中完成,那么性能不是会更高吗,因为您不必处理 I/O 磁盘开销?
是的,会的。为此,您可以使用BytesIO对象(或StringIO),它可以用来代替文件描述符。如果你使用 pyarrow,你就有NativeFile.
当您增加转换文件并将其存储到磁盘的并发进程时,我们是否会遇到有关磁盘的问题,例如在某些时候空间不足或达到磁盘的吞吐量限制?
也是如此,但这是对文件系统(包括数据库)的任何读/写的限制。确保在使用完文件后将其删除,可以节省磁盘空间。此外,在达到磁盘吞吐量限制之前,您更有可能达到带宽限制,除非您正在处理大量磁盘数据或 SQL 语句。
...但是到目前为止我见过的所有库,它们总是写入磁盘。
除非函数明确需要“文件名”,否则您可以将文件指针 ( fp's) 替换为如上所述的缓冲区对象。