У меня есть папка, полная 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
ошибку