2017-06-25 6 views
2

検索APIを使用して収集したjson形式のつぶやきを含むテキストファイル(約600MB)があります。私はつぶやきで「のcreated_at」の値に基づいてツイートをソートし、コードを使用している.I新しいファイルに書きたい:作成した値に基づいてリスト内のつぶやきを並べ替えます

oldlist=[] 
newlist=[] 
with open('abc.txt') as f: 
    for each in f: 
     oldlist.append(json.loads(each)) 
newlist=(sorted(oldlist,key=lambda k: k['created_at'])). 

と私は、テキストファイルに「>>」を使用して出力をリダイレクトすることができます。

小さなファイル(100MB)でも試してみましたが、これにも時間がかかります。これを行うより良い方法はありますか?

+0

のためのパンダを使用するように助言することができます。時間の複雑さの点では、これが最良です。しかし、少し速く*するためにできることはいくつかあります。 –

+0

Woaaaaaah。あなたは_definitely_ 'sorted()'を呼びたくはありません。それはあなたの600 MBのリストのコピーを返します。おそらくCに切り替えるべきです。 –

+0

@Coldspeed:リストのデータをコピーしません。ソートは*浅い*コピーを作成します。それで、20kのリファレンス(例えば)のリストを作成しますが、おそらくほとんどのメモリを消費する辞書自体はコピーされません。 –

答えて

-1

マージソートはここにありますか?ファイルをいくつかの小さなファイルに分割し、それらをそれぞれソートしてから、マージソートのプリセンペアを使用して結合することができます。誰もがあなたがメモリにそれを行うべきであると主張した場合

[OK]を、私はそれPythonであまり

import pandas as pd 
df = pd.read_json('abc.txt') 
df.sort(by='created_at') 
+3

' ..) 'はTimSortを使用します。これは通常、mergesortより高速です。 –

+0

600MBのdictを読み込み、メモリ内のTimSortを実行するのに十分なメモリと時間がありますか? – vZ10

+1

辞書は600MBではなく、合計ファイルです。それを辞書に解析すると、通常はメモリが少しずつ減少します。問題文では、メモリが問題であるとはどこにも指定されていません。さらに、ファイルを使用すると、通常、HDD/SSDがメモリよりも遅いため、効率が低下します。 –

関連する問題