将17GB JSON文件转换为numpy数组

时间:2017-12-21 06:48:49

标签: python json pandas numpy hadoop

我在hdfs中放置了一个大的17 GB JSON文件。我需要读取该文件并转换为nummy数组,然后将其传递给K-Means聚类算法。我尝试了很多方法,但系统运行速度变慢,导致内存错误或内核死机。

JSON structure

我试过的代码是

from hdfs3 import HDFileSystem
import pandas as pd
import numpy as nm
import json
hdfs = HDFileSystem(host='hostname', port=8020)
with hdfs.open('/user/iot_all_valid.json/') as f:
 for line in f:
        data = json.loads(line)
df = pd.DataFrame(data)
dataset= nm.array(df)

我尝试使用ijson,但仍然不确定哪种方法能够以更快的方式执行此操作。

3 个答案:

答案 0 :(得分:1)

因为每列的数据类型都不同,所以pandas数据帧将是一个更合适的数据结构来保持它。你仍然可以使用numpy函数来操作数据。

import pandas as pd
data = pd.read_json('/user/iot_all_valid.json', dtype={<express converters for the different types here>})

为了避免崩溃问题,请尝试在数据集上的小样本上运行k-means。确保按预期工作。然后,您可以增加数据大小,直到您对整个数据集感到满意为止。

答案 1 :(得分:1)

我会远离numpy和Pandas,因为在这两种情况下你都会遇到内存问题。我宁愿坚持SFramethe Blaze ecosystem,它们专门用于处理这种“大数据”案例。惊人的工具!

答案 2 :(得分:1)

为了处理可能比可用ram大的numpy数组,我会使用memory mapped numpy array。在我的机器上,ujson比内置json快3.8倍。假设行是json的行数:

from hdfs3 import HDFileSystem
import numpy as nm
import ujson as json
rows=int(1e8)
columns=4
# 'w+' will overwrite any existing output.npy
out = np.memmap('output.npy', dtype='float32', mode='w+', shape=(rows,columns))
with hdfs.open('/user/iot_all_valid.json/') as f:
    for row, line in enumerate(f):
        data = json.loads(line)
        # convert data to numerical array
        out[row] = data
out.flush()
# memmap closes on delete.
del out