Как вводить большие данные в python pandas с использованием циклов или параллельных вычислений?

У меня есть файл csv 8gb, и я не могу запустить код, так как он показывает ошибку памяти.

file = "./data.csv" df = pd.read_csv(file, sep="/", header=0, dtype=str) 

Я хотел бы разделить файлы на 8 небольших файлов («отсортировано по id») с помощью python. И fianlly, иметь петлю, чтобы выходной файл имел выход из всех 8 файлов.

Или я хотел бы попробовать параллельные вычисления. Основная задача состоит в обработке данных 8gb в python pandas. Спасибо.

Мой файл csv содержит многочисленные данные с '/' в качестве разделителя запятой,

 id venue time code value ...... AAA Paris 28/05/2016 09:10 PAR 45 ...... 111 Budapest 14/08/2016 19:00 BUD 62 ...... AAA Tokyo 05/11/2016 23:20 TYO 56 ...... 111 LA 12/12/2016 05:55 LAX 05 ...... 111 New York 08/01/2016 04:25 NYC 14 ...... AAA Sydney 04/05/2016 21:40 SYD 2 ...... ABX HongKong 28/03/2016 17:10 HKG 5 ...... ABX London 25/07/2016 13:02 LON 22 ...... AAA Dubai 01/04/2016 18:45 DXB 19 ...... . . . . 

5 Solutions collect form web for “Как вводить большие данные в python pandas с использованием циклов или параллельных вычислений?”

 import numpy as np from multiprocessing import Pool def processor(df): # Some work df.sort_values('id', inplace=True) return df size = 8 df_split = np.array_split(df, size) cores = 8 pool = Pool(cores) for n, frame in enumerate(pool.imap(processor, df_split), start=1): frame.to_csv('{}'.format(n)) pool.close() pool.join() 

Используйте параметр chunksize для чтения одного фрагмента в то время и сохранения файлов на диск. Это разделит исходный файл равными частями на 100 000 строк:

 file = "./data.csv" chunks = pd.read_csv(file, sep="/", header=0, dtype=str, chunksize = 100000) for it, chunk in enumerate(chunks): chunk.to_csv('chunk_{}.csv'.format(it), sep="/") 

Если вы знаете количество строк исходного файла, вы можете рассчитать точный chunksize чтобы разделить файл на 8 равных частей ( nrows/8 ).

У pandas read_csv есть два параметра аргументов, которые вы могли бы использовать для выполнения того, что вы хотите сделать:

 nrows : to specify the number of rows you want to read skiprows : to specify the first row you want to read 

См. Документацию по адресу: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html.

Вы также можете использовать фреймворк das, и он встроен в dask.dataframe . По сути, файл csv преобразуется в несколько фреймов данных pandas, каждый из которых считывается, когда это необходимо. Однако, не каждая команда pandas avaialble внутри dask.

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

https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html

 usecols : array-like or callable, default None Return a subset of the columns. [...] Using this parameter results in much faster parsing time and lower memory usage. 
Python - лучший язык программирования в мире.