2017-01-13 6 views
5

これは大規模なJSONファイルを読み込むことではなく、大量のJSONファイルを最も効率的に読み込むことです。Pythonで膨大な数のjsonファイルを読み込んでいますか?

質問

私はMillion song datasetからlast.fmデータセットで働いています。 データは、キーがtrack_id、artist、title、timestamp、similars、およびtagsの場合にJSONでエンコードされたテキストファイルのセットとして利用できます。 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% 1秒未満で)。しかし、完全な列車セットを読むのは遅すぎるので、読むのにはずっと時間がかかります(私は数時間も待っています)、question hereのようなさらなる仕事のためのボトルネックになっています。

私はまた、発電機の理解の代わりに、リストの内包を使うthis question here

UPDATE 1 から明らかに見ることができますJSONファイルを解析するにはスピードのためにujsonを使用しています。

data_list=(json.load(open(file)) for file in all_files) 
+2

RAMが不足しているようですが、SWAPを使い始めると、最も簡単な解決策はRAMを増やすことです。 –

+0

@FranciscoCouzoおそらく最も簡単ですが、間違いなく最も安い! :D – dizzyf

+0

私はすでに16Gigsを持っていますが、私はこのような通常のデータセットを読むのに十分だと思います。非常に多くのjsonファイルを読む良い方法はありますか? – TJain

答えて

0

私はあなたが欲しいファイルのイテレータとちょうどyield 2つの列を構築します。

次に、そのイテレータで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) 

あなたは一度だけあなたのファイルリストの上に移動し、データセットに複数のIO操作を実行しなければならない場合は、前とDataFrame

+0

既に発電機の理解度を使って更新を見てください。 – TJain

+1

私が(ネイティブパッケージ 'json'で)投稿したコードを使用して、' 104秒で列車セットの完全なデータセットをロードしました。 – arthur

+0

私のコードとあなたのコードは1.04秒でサブセット(1%)をロードします。約100秒のうちに何かにロードするためのフル。しかし、私のマシンでは、コードは406秒かかり、コードは473秒かかります。 16GBのRAMを搭載したMacbook Pro 2015を使用しています。 あなたは完全なデータセットに対して完全にスケーリングしているものは何ですか? – TJain

2

にそれを通過した後のデータを複製しません。この方法では、なぜだけでなく、 .jsonファイルをより高速なIO形式に変換しますか?あなたのデータセットの合計サイズが2.5Gであれば、標準的なMacBookでも.csvファイルとして保存されていても、読み込むのに1分以上かかることはありません。

たとえば、pandas 0.20の新機能は.featherの形式です。パンダの著者からの説明は、hereを参照してください。私は標準的なdevのmacbookの私自身のテストでは、私は約1秒で1Gbファイルを読んだ。

もう1つノート:ファンクションのfeather.read_dataを使用することをおすすめします。これは、パンダバージョンではまだ列のサブセットを読み取ることができないためです。あなたはフェザーhereをダウンロードするか、pip install featherを使用してください。

関連する問題