【发布时间】:2017-05-29 01:26:42
【问题描述】:
这不是关于读取大型 JSON 文件,而是关于以最有效的方式读取大量 JSON 文件。
问题
我正在使用来自Million song dataset 的last.fm 数据集。 数据以一组 JSON 编码的文本文件的形式提供,其中的键是:track_id、艺术家、标题、时间戳、相似和标签。
目前,在经历了几个选项后,我正在通过以下方式将它们读入 pandas,因为这是最快的,如 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 中所示。
我还使用ujson 来提高解析json 文件的速度,这可以从this question here 中明显看出
更新 1 使用生成器推导而不是列表推导。
data_list=(json.load(open(file)) for file in all_files)
【问题讨论】:
-
好像你没有足够的RAM,它开始使用SWAP,最简单的解决方案是获得更多的RAM。
-
@FranciscoCouzo 也许是最简单的......但绝对不是最便宜的! :D
-
我已经有 16Gigs 了,我认为这对于读取这样的普通数据集来说绝对足够了。有没有更好的方法来读取这么多的 json 文件?
-
一个接一个地读取所有 JSON,然后将您想要的列写入 CSV 将是微不足道的,几乎不占用 RAM,并简化格式,以便 Pandas、Numpy 或其他任何可以读取它以一种可能更有效的方式聚集在一起。
-
来自labrosa.ee.columbia.edu/millionsong/lastfm "因为遍历 JSON 文件效率低下,而且大多数人只会处理相似性或标签,我们提供了两个 SQLite 数据库 数据。"。下载然后
pd.read_sql('SELECT similars, track_id FROM ...', ...)。