Как уменьшить файл. json - PullRequest
       32

Как уменьшить файл. json

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

Прошу прощения, если это вопрос для начинающих - я sh. Но у меня есть многомерный набор данных из reddit (https://files.pushshift.io/reddit/submissions/), но файлы слишком большие. Можно ли уменьшить частоту дискретизации одного из этих файлов до 20% или менее и сохранить его как новый файл (json или csv) или напрямую прочитать его как pandas кадр данных? Буду очень признателен за любую помощь!

Вот моя попытка до сих пор

def load_json_df(filename, num_bytes = -1):
    '''Load the first `num_bytes` of the filename as a json blob, convert each line into a row in a Pandas data frame.'''
    fs = open(filename, encoding='utf-8')
    df = pd.DataFrame([json.loads(x) for x in fs.readlines(num_bytes)])
    fs.close()
    return df

january_df = load_json_df('RS_2019-01.json')

january_df.sample(frac=0.2)

Однако это вызвало ошибку памяти при попытке открыть ее. Есть ли способ уменьшить его, не открывая весь файл?

Ответы [ 2 ]

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

Я скачал первый из файлов, т.е. https://files.pushshift.io/reddit/submissions/RS_2011-01.bz2 распаковал его и посмотрел на содержимое. Оказывается, это не правильные JSON, а скорее JSON -линии - серия JSON объектов, по одному на строку (см. http://jsonlines.org/). Это означает, что вы можете просто вырезать столько строк, сколько захотите, используя любой инструмент, который вы хотите (например, текстовый редактор). Или вы можете просто последовательно обработать файл в вашем скрипте Python с учетом каждой пятой строки, например:

with open('RS_2019-01.json', 'r') as infile:
    for i, line in enumerate(infile):
        if i % 5 == 0: 
             j = json.loads(line)
             # process the data here
0 голосов
/ 13 апреля 2020

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

Считывание большого файла в память сразу выдает эту ошибку в общем. Вы можете обработать это, прочитав файл построчно с кодом ниже:

data = []
counter = 0
with open('file') as f:
    for line in f:
        data.append(json.loads(line))
        counter +=1

После этого вы сможете сделать это

df = pd.DataFrame([x for x in data]) #you can set a range here with counter/5 if you want to get 20%
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...