私は、大きな出力 .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 時間しかかかりませんでした。