3

私は、大きな出力 .txt ファイルからデータを取得し、.csv の形式で特定の値を解析して再編成する必要があるという問題に取り組んできました。

データの種類 (フライト ID、緯度、経度など) に基づいて列の .csv にすべてのデータを入力するスクリプトを既に作成しましたが、正しい順序ではありません。すべての値は、同じフライト ID に基づいて、タイム スタンプの早いものから新しいものの順にグループ化されることを意図しています。幸いなことに、私の .csv にはすべての値が正しい時間順で含まれていますが、フライト ID に従って適切にグループ化されていません。

私の説明を明確にするために、今はこのように見えます。

(「時間 x」は単に説明するためのものです):

20110117559515, , , , , , , , ,2446,6720,370,42  (Time 0)                               
20110117559572, , , , , , , , ,2390,6274,410,54  (Time 0)                               
20110117559574, , , , , , , , ,2391,6284,390,54  (Time 0)                               
20110117559587, , , , , , , , ,2385,6273,390,54  (Time 0)                               
20110117559588, , , , , , , , ,2816,6847,250,32  (Time 0) 
... 

そして、次のように注文することになっています:

20110117559515, , , , , , , , ,2446,6720,370,42  (Time 0)
20110117559515, , , , , , , , ,24xx,67xx,3xx,42  (Time 1)
20110117559515, , , , , , , , ,24xx,67xx,3xx,42  (Time 2)
20110117559515, , , , , , , , ,24xx,67xx,3xx,42  (Time 3)
20110117559515, , , , , , , , ,24xx,67xx,3xx,42  (Time N)
20110117559572, , , , , , , , ,2390,6274,410,54  (Time 0)
20110117559572, , , , , , , , ,23xx,62xx,4xx,54  (Time 1)
... and so on

簡単にするために、私が出力した .csv には 130 万行あります。順序を修正するために書いた次のスクリプトのロジックは 99% 正しいと確信していますが、非常に非効率的ではないかと恐れています。進行状況を確認するためだけに進行状況バーを追加しましたが、残念ながら次のようになります。

ここに画像の説明を入力

クランチを処理するコードは次のとおりです(必要に応じて、問題の領域までスキップしてください)。

## a class I wrote to handle the huge .csv's ##
from BIGASSCSVParser import BIGASSCSVParser               
import collections                                                              


x = open('newtrajectory.csv')  #file to be reordered                                                  
linetlist = []                                                                  
tidict = {}               

'' To save braincells I stored all the required values
   of each line into a dictionary of tuples.
   Index: Tuple ''

for line in x:                                                                  
    y = line.replace(',',' ')                                                   
    y = y.split()                                                               
    tup = (y[0],y[1],y[2],y[3],y[4])                                            
    linetlist.append(tup)                                                       
for k,v in enumerate(linetlist):                                                
    tidict[k] = v                                                               
x.close()                                                                       


trj = BIGASSCSVParser('newtrajectory.csv')                                      
uniquelFIDs = []                                                                
z = trj.column(0)   # List of out of order Flight ID's                                                     
for i in z:         # like in the example above                                                           
    if i in uniquelFIDs:                                                        
        continue                                                                
    else:                                                                       
        uniquelFIDs.append(i)  # Create list of unique FID's to refer to later                                               

queue = []                                                                              
p = collections.OrderedDict()                                                   
for k,v in enumerate(trj.column(0)):                                            
    p[k] = v  

ここまでは問題ありませんが、次のセグメントでは、コンピューターが詰まるか、コードがうまく動作しません。

for k in uniquelFIDs:                                                           
    list = [i for i, x in p.items() if x == k]                                  
    queue.extend(list)                                                          

アイデアは、すべての一意の値について、130 万の値を順番に繰り返し処理し、各出現のインデックスを順番に返し、それらの値をリストに追加するというものでした。その後、インデックスの膨大なリストを読み取り、その行のデータの内容を別の .csv ファイルに書き込むつもりでした。タダ!おそらく非常に非効率的です。

ここで何が問題なのですか?この問題を解決するためのより効率的な方法はありますか? 私のコードに欠陥があるのでしょうか、それとも私のラップトップに残酷なだけなのでしょうか?

アップデート:

私が処理しているデータの量では、9 ~ 10 時間かかることがわかりました。4.5で半分を正しく吐き出しました。今のところ一晩のクランチを回避できますが、次回はおそらくデータベースまたは別の言語を使用することになるでしょう. 事前に自分が何をしているのかを知っていればよかったのに(笑)。

SSD のスリープ設定を調整した後、クランチするのに 3 時間しかかかりませんでした。

4

2 に答える 2

3

UNIXsortユーティリティを試すことができます。

sort -n -s -t, -k1,1 infile.csv > outfile.csv

-t区切り文字を-k設定し、並べ替えキーを設定します。-sソートを安定させ、-n数値比較を使用します。

于 2013-03-01T02:19:59.100 に答える
2

CSV ファイルが RAM に収まる場合 (例: 2GB 未満)、すべてを読み込んで次の操作を実行できますsort

data = list(csv.reader(fn))
data.sort(key=lambda line:line[0])
csv.writer(outfn).writerows(data)

スラッシングしなければ、それほど時間はかからないはずです。.sortこれは安定したソートであるため、キーが等しい場合にファイルの時間順が保持されることに注意してください。

RAM に収まらない場合は、おそらく少し賢いことをしたいと思うでしょう。たとえば、各行のファイル オフセットを行からの必要な情報 (タイムスタンプとフライト ID) と共に保存し、それらを並べ替えて、行オフセット情報を使用して出力ファイルを書き込むことができます。

于 2013-03-01T01:40:47.370 に答える