将17gbjson文件转换为numpy数组

jm81lzqq  于 2021-05-29  发布在  Hadoop
关注(0)|答案(3)|浏览(436)

我在hdfs中放置了一个大的17gbjson文件。我需要读取该文件并将其转换为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,但仍然不确定哪种方法是正确的,以更快的方式做到这一点。

x9ybnkn6

x9ybnkn61#

为了处理可能比可用ram大的numpy数组,我将使用内存Map的numpy数组。在我的机器上,ujson比内置json快3.8倍。假设rows是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
n3ipq98p

n3ipq98p2#

我会远离numpy和Pandas,因为这两种情况下你都会有记忆问题。我宁愿坚持使用sframe或blaze生态系统,它们是专门为处理这种“大数据”案例而设计的。神奇的工具!

lp0sw83n

lp0sw83n3#

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

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

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

相关问题