Есть ли способ разбить файл SAS размером около 16 ГБ на несколько файлов / фреймов данных в Python? - PullRequest
0 голосов
/ 12 февраля 2020

У меня есть необработанный файл SAS размером около 16 ГБ, и даже после того, как столбцы соответствуют моей проблеме, размер файла составляет около 8 ГБ. Это выглядит примерно так:

CUST_ID   FIELD_1   FIELD_2   FIELD_3 ... FIELD_7
1          65         786      ABC          Y
2          87         785      GHI          N
3          88         877      YUI          Y
...
9999999    92         767      XYS          Y

Когда я пытался импортировать его в Python с помощью кода: df=pd.read_sas(path,format='SAS7BDAT') мой экран стал черным, и после нескольких попыток я наконец-то получил ошибку MemoryError , Поскольку для моей задачи мне нужен весь набор CUST_ID, выбор только образца и удаление других строк исключены.

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

Есть ли способ решить эту проблему? Я действительно ценю всю помощь, которую я могу получить!

Редактировать:

Я пробовал это

chunk_list=[]
for chunk in df_chunk 
       chunk_filter=chunk
       chunk_list.append(chunk_filter)

df_concat=pd.concat(chunk_list)

Но я все еще получаю Memory Error. Любая помощь??

Ответы [ 2 ]

1 голос
/ 12 февраля 2020

Существует аргумент chunksize для read_sas, который должен позволить вам разбить большой файл на более мелкие части, чтобы вы могли его прочитать. chunksize - это количество записей для чтения за один раз.

0 голосов
/ 12 февраля 2020

Установите флаг итератора в true и разделите файл на al oop перед выполнением обработки.

Ref: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_sas.html

или разбить файл в SAS перед выполнением вывода.


Я думаю, что вы пытаетесь это следующее:

CHUNK = 10
df=pd.read_sas(path,format='SAS7BDAT',chunksize = CHUNK)

for chunk in df:
  # perform compression
  # write it out of your memory onto disk to_csv('new_file',
    # mode='a', # append mode
    # header=False, # don't rewrite the header, you need to init the file with a header
    # compression='gzip') # this is more to save space on disk maybe not needed

df=pd.read_csv(new_file)

Вы можете попытаться сжать данные внутри l oop, так как в противном случае при слиянии снова произойдет сбой:

  1. Удаление столбцов
  2. Нижний диапазон числового dtype
  3. Категориальные данные
  4. Разреженные столбцы

Ссылка: https://pythonspeed.com/articles/pandas-load-less-data/

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