Pandas DataFrame для буфера паркета в памяти - PullRequest
0 голосов
/ 23 октября 2018

Вариант использования следующий:

  1. Считывание данных из внешней базы данных и загрузка их в pandas dataframe
  2. Преобразование этого кадра данных в буфер формата паркета
  3. Загрузкаэтот буфер для s3

Я пытался сделать второй шаг в памяти (без необходимости сохранять файл на диск, чтобы получить формат паркета), но все библиотеки, которые я имеюдо сих пор они всегда записывают на диск.

Итак, у меня есть следующие вопросы:

  • Разве это не будет более производительным, если преобразование будет выполнено в памяти, так как вы неВам не придется иметь дело с дисковыми издержками ввода-вывода?
  • Поскольку вы увеличиваете число одновременных процессов, конвертирующих файлы и сохраняющих их на диск, разве у нас не может возникнуть проблем с диском, таких как нехватка места в некоторых точках илидостижение лимита пропускной способности диска?

Ответы [ 2 ]

0 голосов
/ 04 июня 2019

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)

0 голосов
/ 23 октября 2018

Разве это не будет более производительным, если преобразование будет выполнено в оперативной памяти, поскольку вам не придется иметь дело с накладными расходами диска ввода-вывода?

Да, было бы.И для этого вы можете использовать объект BytesIO (или StringIO), который можно использовать вместо файловых дескрипторов.Если вы используете pyarrow, у вас есть NativeFile.

Поскольку вы увеличиваете число одновременных процессов, конвертирующих файлы и сохраняющих их на диск, у нас не могло возникнуть проблем с дискомнапример, нехватка места в некоторых точках или ограничение пропускной способности диска?

Также верно, но это ограничение для любых операций чтения / записи из / в файловую систему, включая базы данных.Дисковое пространство можно сэкономить, гарантируя, что файлы будут удалены, как только вы закончите с ними.Кроме того, вы с большей вероятностью достигнете предела пропускной способности, прежде чем достигнете предела пропускной способности диска, если только вы не обрабатываете много данных на диске или операторов SQL.

... но всебиблиотеки, которые я видел до сих пор, они всегда записывают на диск.

Если функциям явно не нужно «имя файла», вы можете заменить файловые указатели (fp) набуферный объект, как указано выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...