Подтвердить что ты не робот

Как вводить большие данные в 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   ......
.
.
.
.
4b9b3361

Ответ 1

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()

Ответ 2

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

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).

Ответ 3

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

Ответ 4

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

Ответ 5

Если вам не нужны все столбцы, вы также можете использовать параметр 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.