Как обойти Memory Error при использовании Pandas? - PullRequest
0 голосов
/ 02 апреля 2020

Я знаю, что Memors Error является распространенной ошибкой при использовании различных функций библиотеки Pandas. Я хочу получить помощь в нескольких областях. Мои вопросы сформулированы ниже, после описания проблемы.

Моя ОС - Ubuntu 18, рабочее пространство - ноутбук Jupyter в рамках Anaconda, объем оперативной памяти 8 ГБ.

Задача, которую я решить.

У меня более 100 000 словарей, содержащих данные о посещениях сайта пользователями, например:

{'meduza.io': 2, 'google.com' : 4, 'oracle .com': 2, 'mail.google.com': 1, 'yandex.ru': 1, 'user_id': 3}

Необходимо сформировать DataFrame из этих данных. Сначала я использовал функцию добавления для добавления словарей построчно в DataFrame.

for i in tqdm_notebook(data):
   real_data = real_data.append([i], ignore_index=True)

Но набор игрушечных данных показал, что выполнение этой функции занимает много времени. Затем я непосредственно попытался создать DataFrame, передав массив со словарями, подобными этому.

real_data = pd.DataFrame(data=data, dtype='int')

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

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

  1. Я хочу понять, как рассчитывается необходимый объем памяти для работы Pandas работает. Судя по количеству вопросов по этой теме c, при чтении, объединении и т. Д. c возникает ошибка памяти. Можно ли включить файл подкачки для решения этой проблемы?

  2. Как эффективнее реализовать решение проблемы с добавлением словарей в DataFrame? «Добавить» не работает эффективно. Создание DataFrame из полного набора данных более эффективно, но приводит к ошибке. Я не понимаю реализацию этих процессов, но я хочу выяснить, какой самый эффективный способ преобразования данных, как моя задача.

1 Ответ

0 голосов
/ 02 апреля 2020

Я бы предложил указать dtypes столбцов, возможно, он пытается прочитать их как типы объектов - например, если используется DataFrame.from_dict, укажите аргумент dtype; dtype={'a': np.float64, 'b': np.int32, 'c': 'Int64'}. Лучший способ создать фрейм данных - это использовать объект словаря. Никогда не используйте dataframe.append, потому что это действительно неэффективно. и убить их, прежде чем пытаться выполнить загрузку.

Вы также можете попробовать и посмотреть, в какой момент возникает ошибка памяти - 50k, 70k, 100k?

Отладка кадра данных и посмотреть, какие типы будучи загруженным, и убедитесь, что эти типы являются наименьшими соответствующими (например, bool, а не object).

РЕДАКТИРОВАТЬ : что может сделать ваш фрейм данных очень большим, если у вас много разреженных записей, особенно если в заголовках много разных доменов. Возможно, было бы лучше изменить столбцы на более подход «ключ: значение», например, например, {'domain': 'google.ru', 'user_id': 3, 'count': 10}. У вас может быть 100 тыс. Столбцов!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...