目前,我正在编写程序,需要加载超过13K "*.json"大小不一的文件,从几行到10万行不等。阅读看起来像:
[read_one_JSON(p) for p in filenames]
def read_one_JSON(path: str):
with open(path, encoding='utf-8') as fh:
data = json.load(fh)
return File(data["_File__name"], data['_File__statements'], data['_File__matches'])
我加载文件,将它传递给类file并读取另一个文件。目前大约需要2分20秒。我发现,当我把数据处理移到类中,只生成:
[read_one_JSON(p) for p in filenames]
def read_one_JSON(path: str):
with open(path, encoding='utf-8') as fh:
data = json.load(fh)
它将时间缩短了10秒,达到2分10秒。然后我还删除了json。加载以查看导致阅读时间的原因。所以,当离开时,只需:
[read_one_JSON(p) for p in filenames]
def read_one_JSON(path: str):
with open(path, encoding='utf-8') as fh:
而不读取数据,它仍然持续1分45秒。意思是,打开文件很慢。有没有办法加快进程的打开部分,而不把所有东西放在一个文件或并行化?这是一个选项,但我想知道是否还有其他办法。
在此之前,我意识到这样的瓶颈,我尝试过像ujson,orjson,msgspec这样的库,但由于开始阶段很慢,它只产生了很小的差异。在当前目录创建13000个文件:
import json
from tqdm import tqdm # pip install tqdm
for i in tqdm(range(13_000)):
filename = f"data_{i}.json"
data = {"filename": filename}
with open(filename, "w") as file:
json.dump(data, file)
100%|██████████| 13000/13000 [00:01<00:00, 8183.74it/s]
这意味着它在我的电脑上运行了不到2秒。tqdm
是查看吞吐量的一种非常简单的方法。脚本生成如下文件:
{"filename": "data_0.json"}
然后阅读它们:
import json
from tqdm import tqdm # pip install tqdm
for i in tqdm(range(13_000)):
filename = f"data_{i}.json"
with open(filename, "rt") as file:
data = json.load(file)
print(data)
100%|██████████| 13000/13000 [00:00<00:00, 16472.00it/s]
{'filename': 'data_12999.json'}
这意味着它们都在不到一秒的时间内被读取。
也许它来自于你读的文件的大小。如果您有很多大文件,确实会花费更多的时间。但是你的磁盘似乎并不是导致速度变慢的唯一原因。