Объединение многих файлов CSV приводит к смерти ядра - PullRequest
1 голос
/ 01 марта 2020

Мне нужно предварительно обработать множество таблиц csv , чтобы применить их к автоэнкодеру.

Используя pandas, я читаю все эти таблицы как кадры данных. Затем мне нужно объединить их на основе общего ключа (id). merged = pd.merge(df, df1, on='id', how = 'left').

Однако после пары слияний размер получившейся таблицы стал очень большим и убил ядро. Это последний размер, который я получил за результат объединения до того, как ядро ​​умерло merged.shape = (29180782, 71). И мне нужно объединить еще много таблиц.

Все таблицы имеют внешний вид, подобный этому, но с большим количеством строк и столбцов (значения, определенные в каждом столбце, показывают категорию):

df:                         df1:
    id    a    b   c   d       id    e    f   g   h
0  2000   1    1   1   3      2000   1    1   1   1
1  2001   2    1   1   3      2001   2    0   0   3
2  2002   1    3   1   2      2002   1    3   1   2
3  2003   2    2   1   1      2003   1    0   1   1

Я пробовал Перо , но это не помогает. Я также попытался уменьшить количество столбцов df['a'] = pd.to_numeric(df['a'], downcast='unsigned'), но не увидел различий в размере таблицы. Последнее решение пришло мне в голову - использовать чанк. Я попробовал приведенный ниже код с разными размерами чанка, но ядро ​​снова умерло:

for chunk in pd.read_csv('df1', chunksize = 100000, low_memory=False):
    df = pd.merge(df,chunk , on='id', how = 'left')

Поэтому я решил записать файл вместо использования переменной, чтобы ядро ​​не погибло. Сначала я сохранил последнюю объединенную таблицу в csv-файле, чтобы читать ее по частям для следующего процесса объединения.

lastmerged.to_csv(r'/Desktop/lastmerged.csv', index=False)

А затем:

from csv import writer
for chunk in pd.read_csv('lastmerged.csv', chunksize = 100000, low_memory=False):
    newmerge = pd.merge(df1,chunk , on='id', how = 'right')

    with open('newmerge.csv', 'a+', newline='') as write_obj:
        csv_writer = writer(write_obj)
        for i in range (len(newmerge)):
            csv_writer.writerow(newmerge.loc[i,:])

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

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

Ответы [ 2 ]

0 голосов
/ 03 марта 2020

Вы можете преобразовать свои pandas кадры данных в dask. А затем объедините ваши фреймы данных с помощью dd.merge ().

import dask.dataframe as dd
d_df = dd.from_pandas(df, chunksize=10000)

Для данных, которые помещаются в ОЗУ, Pandas часто может быть быстрее и проще в использовании, чем Dask DataFrame, но когда у вас есть проблемы с размером ОЗУ, вы можете использовать Dask для работы с жестким диском и ОЗУ .

0 голосов
/ 01 марта 2020

вы можете собрать их в список и использовать

total_df = pd.concat([df1,df2,df3,df4...,dfn],axis = 1)

вы также можете использовать

for name in filename:
  df = pd.concat([df,pd.read_csv(name,index_col= False)])

Таким образом, вы можете передать проблему с памятью

...