Ошибка памяти при чтении очень длинной строки в json-файле с помощью Python

У меня есть файл json размером 1 ГБ с очень длинными строками, когда я пытаюсь загрузить строку из файла, я получаю эту ошибку из консоли PyCharm:

Traceback (most recent call last):
  File "C:\Program Files\JetBrains\PyCharm 2017.3.3\helpers\pydev\pydev_run_in_console.py", line 53, in run_file
    pydev_imports.execfile(file, globals, locals)  # execute the script
  File "......... .py", line 26, in <module>
    for line in f:
MemoryError
PyDev console: starting.
Python 2.7.14 (v2.7.14:84471935ed, Sep 16 2017, 20:19:30) [MSC v.1500 32 bit (Intel)] on win32

Я нахожусь на машине с Windows Server с 64 ГБ оперативной памяти.

Мой код:

import numpy as np
import json
import sys
import re

idRegEx = re.compile(r".*ID = ")
endElRegEx = re.compile(r"'.*")

ratingsFile = sys.argv[1]
tweetsFile = sys.argv[2]
outputFile = sys.argv[3]

tweetsMap = {}
with open(tweetsFile, "r") as f:

    for line in f:
        tweetData = json.loads(line)
        tweetsMap[tweetData["key"]] = tweetData

output = open(outputFile, "w")

with open(ratingsFile, "r") as f:
    header = f.next()

    for line in f:
        topicData = line.split("\t")

        topicKey = topicData[0]
        topicTerms = topicData[1]
        ratings = topicData[2]
        reasons = topicData[3]

        ratings = map(lambda x: int(x.strip().replace("'", "")), ratings.replace("[", "").replace("]", "").split(","))
        ratings = np.array(ratings)

        tweetsMap[topicKey]["ratings"] = ratings.tolist()
        tweetsMap[topicKey]["mean"] = ratings.mean()

        topicMap = tweetsMap[topicKey]

        print topicMap["key"], topicMap["mean"]

        json.dump(topicMap, output, sort_keys=True)
        output.write("\n")

output.close()

Строка 26 сообщения об ошибке относится к

tweetData = json.loads(line)

а строка 53 относится к

json.dump(topicMap, output, sort_keys=True)

Странно то, что я раздвоил этот код из GitHub и думаю, он должен работать.

вы тоже форкнули данные? Ваши данные слишком велики - зачем вам нужен 1 ГБ json твитов в одном файле?

Patrick Artner 10.03.2018 18:18

@PatrickArtner: может быть много веских причин для чтения таких больших объектов JSON, но в случае твитов я, конечно, предпочел бы помещать по одному твиту в строку и читать их отдельно, а не сериализовать и десериализовать их отличный гудящий список.

Martin Sand Christensen 10.03.2018 18:23

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

ocram 10.03.2018 18:25
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
4
807
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, вы используете 32-битную версию Python:

Python 2.7.14 (...) [MSC v.1500 32 bit (Intel)] on win32

У него есть ограничение памяти в 2 ГБ на процесс в Windows, поэтому вы получаете ошибку памяти, даже если у вас много оперативной памяти. Переход на 64-битную версию Python должен решить вашу проблему, если вы не хотите менять свой скрипт.

Спасибо, попробую! Могу ли я установить его вместе с 32-битной версией или лучше удалить раньше?

ocram 10.03.2018 18:27

Ознакомьтесь с этот вопрос о переполнении стека для получения этой информации, хотя я не вижу причин для сохранения 32-разрядного Python, если установлена ​​64-разрядная версия.

devius 10.03.2018 18:30

Другие вопросы по теме