这不是关于阅读大型JSON文件,而是以最有效的方式阅读大量JSON文件。
问题
我正在使用last.fm中的Million song dataset数据集。 数据以一组JSON编码的文本文件的形式提供,其中的键是:track_id,artist,title,timestamp,similars和tags。
目前我在通过几个选项后以下列方式将它们读入大熊猫,因为这是最快的here:
import os
import pandas as pd
try:
import ujson as json
except ImportError:
try:
import simplejson as json
except ImportError:
import json
# Path to the dataset
path = "../lastfm_train/"
# Getting list of all json files in dataset
all_files = [os.path.join(root,file) for root, dirs, files in os.walk(path) for file in files if file.endswith('.json')]
data_list=[json.load(open(file)) for file in all_files]
df = pd.DataFrame(data_list, columns=['similars', 'track_id'])
df.set_index('track_id', inplace=True)
当前方法读取子集(不到一秒钟内完整数据集的1%)。然而,阅读整套列车的速度太慢而且需要永远(我也等了几个小时)才能阅读,并且已经成为question here所示的进一步任务的瓶颈。
我还在解析json文件时使用ujson
来提高速度,这显然可以从this question here
更新1 使用生成器理解而不是列表理解。
data_list=(json.load(open(file)) for file in all_files)
答案 0 :(得分:2)
如果必须对数据集执行多个IO操作,为什么不将.json
文件转换为更快的IO格式?如果数据集的总大小为2.5G,读取时间不应超过一分钟,即使在标准macbook上存储为.csv
文件时也是如此。
例如,pandas 0.20中的新内容是.feather
格式。有关pandas作者的说明,请参阅here。在我自己对标准开发macbook的测试中,我在大约1秒内读取了1Gb文件。
另一个注意事项:我建议在顶级feather.read_data
函数上使用pandas.read_feather
,因为pandas版本还不允许读取列的子集。您可以下载羽毛here或只使用pip install feather
。
答案 1 :(得分:0)
我会在文件上构建一个迭代器,只需要yield
你想要的两列。
然后,您可以使用该迭代器实例化DataFrame
。
import os
import json
import pandas as pd
# Path to the dataset
path = "../lastfm_train/"
def data_iterator(path):
for root, dirs, files in os.walk(path):
for f in files:
if f.endswith('.json'):
fp = os.path.join(root,f)
with open(fp) as o:
data = json.load(o)
yield {"similars" : data["similars"], "track_id": data["track_id"]}
df = pd.DataFrame(data_iterator(path))
df.set_index('track_id', inplace=True)
这样您只需查看一次文件列表,就不会在将数据传递给DataFrame
之前和之后复制数据