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

Pandas read_csv на 6.5 ГБ файл потребляет более 170 ГБ ОЗУ

Я хотел поднять это, просто потому, что он сумасшедший. Может, у Уэса есть какая-то идея. Файл довольно регулярный: 1100 строк x ~ 3M столбцов, данные разделены на вкладку, состоящие исключительно из целых чисел 0, 1 и 2. Очевидно, этого не ожидается.

Если я предварительно заполняю фрейм данных, как показано ниже, он потребляет ~ 26 ГБ ОЗУ.

h = open("ms.txt")
header = h.readline().split("\t")
h.close()
rows=1100
df = pd.DataFrame(columns=header, index=range(rows), dtype=int)

Информация о системе:

  • python 2.7.9
  • ipython 2.3.1
  • numpy 1.9.1
  • pandas 0.15.2.

Любые идеи приветствуются.

4b9b3361

Ответ 1

Проблема вашего примера.

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

header = ['a','b','c']
rows = 11
df = pd.DataFrame(columns=header, index=range(rows), dtype=int)

df.dtypes
a    object
b    object
c    object
dtype: object

Это связано с тем, что, несмотря на то что вы предоставляете функции pd.read_csv инструкцию, что столбцы dtype=int, она не может переопределять типы dtypes, которые в конечном итоге определяются данными в столбце.

Это связано с тем, что pandas тесно связан с numpy и numpy dtypes.

Проблема в том, что в созданном фрейме данных нет данных, поэтому numpy по умолчанию присваивает данные np.NaN, которые не помещаются в целое число.

Это означает, что numpy запутался и по умолчанию возвращается к типу dtype object.

Проблема объекта dtype.

Наличие dtype, установленного в object, означает большие накладные расходы в потреблении памяти и времени размещения по сравнению с тем, если вы установили dtype как integer или float.

Обходной путь для вашего примера.

df = pd.DataFrame(columns=header, index=range(rows), dtype=float)

Это работает отлично, поскольку np.NaN может жить в поплавке. Это дает

a    float64
b    float64
c    float64
dtype: object

И нужно меньше памяти.

Подробнее о том, как относиться к dtypes

См. этот связанный пост для получения более подробной информации о dtype: Pandas параметры read_csv low_memory и dtype

Ответ 2

Аналогичная проблема, с которой я столкнулся сегодня с данными 3 ГБ, и я просто немного изменил свой стиль кодирования, а не метод file.read() и file.readline(), который я использовал под кодом, который ниже кода просто загружает 1 строка за раз в ram

import re

df_list = []

with open("ms.txt", 'r') as f:
    for line in f:
        #process(line)
        line = line.strip()
        columns = re.split("\t", line, maxsplit=4) # you should modify these according to your split criteria
        df_list.append(columns)

Вот код для преобразования ваших данных в pandas dataframe.

import pandas as pd
df = pd.DataFrame(df_list)# here you will have to modify according to your data frame needs