我在hdfs中放置了一个大的17 GB JSON文件。我需要读取该文件并转换为nummy数组,然后将其传递给K-Means聚类算法。我尝试了很多方法,但系统运行速度变慢,导致内存错误或内核死机。
我试过的代码是
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,但仍然不确定哪种方法能够以更快的方式执行此操作。
答案 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,因为在这两种情况下你都会遇到内存问题。我宁愿坚持SFrame或the 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