我有一个文件夹,里面装满了用gzip压缩的json文件(~10gb,大部分是文本数据)。我目前有一些代码可以工作,但速度非常慢(想想几个小时):
from glob import glob
filenames = glob('folder_path/*')
dataframes = [pd.read_json(f, compression='gzip') for f in filenames]
我希望找到一种更快的方法来解压所有文件,并将每个文件一个一个地保存到一个df,或将所有文件保存到一个df(此时,1对多个df对我来说并不重要)。我读过关于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)
工作正常,比将compression='gzip'传递给pd.read_json要快,但我不知道如何让它对所有文件都起作用
编辑: 尝试了以下操作:
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
错误
我已经引导OP完成了一些更改,以解决初步的回溯问题,这应该允许OP在较小的数据集上运行此过程。然而,真正的问题是数据集太大,无法真正做到这一点。由于目标是训练LDA模型,我建议OP调查支持在线学习的图书馆,这样模型就可以在没有不可能的内存占用的情况下建立起来
这并不是对“将多个json文件从文件夹解压缩到文件夹”这一更一般主题的回答,但这并不是真正的主要问题。以下(未测试的)代码可以在文件夹中的gzip文件上循环,并将每个文件读入数据帧。然后concat或根据需要处理这些数据帧
请注意,使用pandas在许多文件上执行此操作非常缓慢。您最好读取和解析原始JSON结构,根据需要清理/转换它们,然后在所有组合数据(或数据块)上形成最终的数据帧。或者,如果不是真的有必要的话,完全避免熊猫
相关问题 更多 >
编程相关推荐