Распаковка нескольких json файлов из папки в pandas df - PullRequest
0 голосов
/ 07 января 2020

У меня есть папка, полная json файлов (~ 10 ГБ, в основном текстовые данные), которые были заархивированы с помощью gzip. В настоящее время у меня есть код, который работает, но мучительно медленно (подумайте несколько часов):

from glob import glob
filenames = glob('folder_path/*')
dataframes = [pd.read_json(f, compression='gzip') for f in filenames]

Я надеюсь найти более быстрый способ разархивировать все файлы и сохранить каждый по одному в pandas DF или все из них в один DF (1 против многих DFS не имеет значения для меня в этот момент). Я читал о zlib, но это не работает для файлов GZIP? Я тоже пробовал там несколько разных вещей, но ни одна из них не работает, например:

filenames = glob('folder_path/*')
jsonobjs = [gzip.open(f, 'rb') for f in filenames]

возвращает:

---------------------------------------------------------------------------
OSError                                   Traceback (most recent call last)
<ipython-input-12-a5a84131bb38> in <module>
      1 filenames = glob('folder_path/*')
----> 2 jsonobjs = [gzip.open(f, 'rb') for f in filenames]

<ipython-input-12-a5a84131bb38> in <listcomp>(.0)
      1 filenames = glob('folder_path/*')
----> 2 jsonobjs = [gzip.open(f, 'rb') for f in filenames]

~/anaconda3/lib/python3.7/gzip.py in open(filename, mode, compresslevel, encoding, errors, newline)
     51     gz_mode = mode.replace("t", "")
     52     if isinstance(filename, (str, bytes, os.PathLike)):
---> 53         binary_file = GzipFile(filename, gz_mode, compresslevel)
     54     elif hasattr(filename, "read") or hasattr(filename, "write"):
     55         binary_file = GzipFile(None, gz_mode, compresslevel, filename)

~/anaconda3/lib/python3.7/gzip.py in __init__(self, filename, mode, compresslevel, fileobj, mtime)
    161             mode += 'b'
    162         if fileobj is None:
--> 163             fileobj = self.myfileobj = builtins.open(filename, mode or 'rb')
    164         if filename is None:
    165             filename = getattr(fileobj, 'name', '')

OSError: [Errno 24] Too many open files: 'folder_path/d2ea1c35275b495fb73cb123cdf4fe4c'

и

with gzip.open(glob('folder_path/*'), 'rb') as f:
    file_content = f.read()

возвращает :

TypeError                                 Traceback (most recent call last)
<ipython-input-10-bd68570238cd> in <module>
----> 1 with gzip.open(glob('folder_path/*'), 'rb') as f:
      2         file_content = f.read()

TypeError: 'module' object is not callable

Итак, это:

with gzip.open('single_file', 'rb') as f:
    file_content = f.read()
pd.read_json(file_content)

работает просто отлично и быстрее, чем передача сжатия = 'gzip' в pd.read_ json, но я не знаю как заставить это работать для всех файлов.

edit: пробовал следующее:

for file_name in glob('folder_path/*'):
     with [gzip.open(f, 'rb') for f in filenames]:
            file_name = pd.read_json(f)

, но это возвращает ту же too many open files ошибку

1 Ответ

0 голосов
/ 07 января 2020

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

Это не ответ на более общую тему c «Разархивирование нескольких json файлов из папки в pandas df», но на самом деле это был не главный вопрос. Следующий (непроверенный) код может l oop поверх сжатых файлов в папке и считывать каждый из них в кадр данных. Затем либо concat , либо обработайте эти кадры данных по мере необходимости.

from glob import glob
import gzip

for fname in glob('folder_path/*gz'):
    with gzip.open(fname, 'rb') as f:
        df = pd.read_json(f)

Обратите внимание, что это выполняется довольно медленно для многих файлов с pandas. Скорее всего, вам лучше будет прочитать и проанализировать необработанные JSON структуры, очистить / преобразовать их по мере необходимости, а затем сформировать окончательный pandas кадр данных для всех объединенных данных (или фрагментов данных). Или вообще избегайте pandas, если это действительно не нужно.

...