Как прочитать два больших 5GB CSV-файла в локальной системе Jupyter Notebook, используя python pandas? Как объединить два кадра данных для анализа данных в локальном? - PullRequest
4 голосов
/ 24 января 2020

Как загрузить два больших (5 ГБ) каждого файла CSV в локальную систему Jupyter Notebook, используя python pandas. Пожалуйста, предложите любую конфигурацию для обработки больших файлов CSV для анализа данных?

Local System Configuration:
OS: Windows 10
RAM: 16 GB
Processor: Intel-Core-i7

Код:

dpath = 'p_flg_tmp1.csv'
pdf = pd.read_csv(dpath, sep="|") 

Error:
MemoryError: Unable to allocate array

или

pd.read_csv(po_cust_data, sep="|", low_memory=False)

Error:
ParserError: Error tokenizing data. C error: out of memory

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

Ответы [ 3 ]

4 голосов
/ 24 января 2020

Если вам не нужно обрабатывать все сразу, вы можете использовать куски:

reader = pd.read_csv('tmp.sv', sep='|', chunksize=4000)   
for chunk in reader:
     print(chunk)

, см. Документацию из Pandas для получения дополнительной информации.

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

  1. Увеличение оперативной памяти вашей системы
  2. Переключение на другой тип хранения данных

CSV-файл занимает огромное количество памяти в ОЗУ, для получения дополнительной информации см. эту статью , даже если он предназначен для другого программного обеспечения, он дает хорошее представление о проблеме:

Использование памяти

Вы можете оценить использование памяти вашего CSV-файла по следующей простой формуле:

memory = 25 * R * C + F 

, где R - количество строк, C - число столбцы и F размер файла в байтах.

Один из моих тестовых файлов имеет размер 524 МБ, содержит 10 столбцов в 4,4 миллиона строк. При использовании приведенной выше формулы использование оперативной памяти составит около 1,6 ГБ:

memory = 25 * 4,400,000 * 10 + 524,000,000 = 1,624,000,000 bytes

Когда этот файл открывается в Tablecruncher, монитор активности сообщает об использовании 1,4 ГБ ОЗУ, поэтому формула представляет собой довольно точное предположение.

2 голосов
/ 24 января 2020

Используйте чанк для частичного чтения данных.

dpath = 'p_flg_tmp1.csv'

for pdf in pd.read_csv(dpath, sep="|", chunksize=1000):
    *do something here*
0 голосов
/ 28 января 2020

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

Но что тогда? Остальная часть вашего алгоритма тоже чанкна? У вас будет достаточно ОЗУ для обработки чего-либо? А как насчет производительности процессора? Достаточно ли одного маленького i7? Вы планируете часы или дни ожидания для результатов? Конечно, все это может быть приемлемо для вашего варианта использования, но мы этого не знаем.

В определенный момент, если вы хотите использовать большие данные, вам нужны большие компьютеры. Вы действительно должны сделать это на месте? Даже если вы не готовы к распределенным вычислениям по кластерам, вы можете просто получить экземпляр виртуальной машины соответствующего размера. Ваша компания заплатит за это. Они платят за себя. Гораздо дешевле дать вам лучший компьютер, чем платить за то, что вы подождете, пока маленький компьютер не достигнет 1008 *. В Индии цена крысы ios между затратами на рабочую силу / AWS ниже, чем в США, конечно, но она все еще стоит того. Будь как эй босс, ты хочешь, чтобы это заняло 3 дня или 3 недели?

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

...