Разделить действительно большой файл на более мелкие файлы в Python - слишком много открытых файлов - PullRequest
0 голосов
/ 27 апреля 2018

У меня действительно большой CSV-файл (близкий к терабайту), который я хочу разбить на более мелкие CSV-файлы на основе информации в каждой строке.

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

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

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

Каким будет рабочий (быстрый, в идеале) подход к этому?

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

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

Метод .read_csv в pandas будет использовать программу чтения csv только для частичного чтения файлов csv без загрузки всего файла в память. Лучше всего сделать несколько проб и ошибок и посмотреть, сколько строк может поддерживать ваша система за один раз

import pandas as pd
num_rows = 6000 # or some value which depends on system memory 
NewDf1 =pd.DataFrame()
NewDf2 = pd.DataFrame()

for i in range(start,stop,num_rows):
    rawdata_df = pd.read_csv(filename,skiprows=range(1,i),nrows=num_rows) 
    NewDf1.append(rawdata_df[rawdata_df.iloc[1]>0],ignore_index=True)
    NewDf2.append(rawdata_df[rawdata_df.iloc[2]>0],ignore_index=True)

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

 if len(NewDf1) > toolarge:
      NewDf1.to_csv('newdf1Filename.csv')
0 голосов
/ 27 апреля 2018

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

import pandas as pd
import os

df_chunked = pd.read_csv("myLarge.csv", chunksize=30000)  # you can alter the chunksize

for chunk in df_chunked:
    uniques = chunk['col'].unique().tolist()
    for val in uniques:
        df_to_write = chunk[chunk['col'] == val]
        if os.path.isfile('small_{}.csv'.format(val)):  # check if file already exists
            df_to_write.to_csv('small_{}.csv'.format(val), mode='a', index=False, header=False)
        else:
            df_to_write.to_csv('small_{}.csv'.format(val), index=False)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...