Pandas数据框到内存中的镶木地板缓冲区

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (13)

用例如下:

  1. 从外部数据库读取数据并将其加载到pandas数据帧中
  2. 将该数据帧转换为镶木地板格式缓冲区
  3. 将该缓冲区上传到s3

我一直在尝试在内存中执行第二步(无需将文件存储到磁盘以获得镶木地板格式),但到目前为止我看到的所有库,它们总是写入磁盘。

所以我有以下问题:

  • 如果转换是在内存中完成的,那么它不会更高效,因为您不必处理I / O磁盘开销吗?
  • 当您增加转换文件并将其存储到磁盘的并发进程时,我们是否有关于磁盘的问题,例如某些点的空间不足或达到磁盘的吞吐量限制?
提问于
用户回答回答于

如果转换是在内存中完成的,那么它不会更高效,因为您不必处理I / O磁盘开销吗?

是的,它会的。为此你可以使用一个BytesIO对象(或StringIO),它可以用来代替文件描述符。如果你正在使用pyarrow,你就有了NativeFile

当您增加转换文件并将其存储到磁盘的并发进程时,我们是否有关于磁盘的问题,例如某些点的空间不足或达到磁盘的吞吐量限制?

同样正确,但这是对文件系统(包括数据库)的任何读/写的限制。通过确保在完成文件后删除文件,可以节省磁盘空间。此外,在达到磁盘吞吐量限制之前,您更有可能达到带宽限制,除非您正在处理大量磁盘上的数据或SQL语句。

...但到目前为止我见过的所有库,它们总是写入磁盘。

除非函数明确需要“文件名”,否则可以用fp上面提到的缓冲区对象替换文件指针('s)。

用户回答回答于

Apache Arrowpyarrow库应该解决这个问题,并在内存中进行大量处理。在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)

所属标签

可能回答问题的人

  • HKC

    红客学院 · 创始人 (已认证)

    26 粉丝7 提问5 回答
  • Dingda

    Dingda · 站长 (已认证)

    4 粉丝0 提问3 回答
  • 西风

    renzha.net · 站长 (已认证)

    9 粉丝1 提问3 回答
  • 螃蟹居

    1 粉丝0 提问2 回答

扫码关注云+社区

领取腾讯云代金券