2016-11-27 4 views
0

だから私が持っている問題は、かなり大きなcsvファイルを反復処理していることです。 startDateとendDateはユーザから私に与えられた入力であり、その範囲でのみ検索する必要があります。特定の範囲を指定してcsvファイルを反復する

私はその時点までプログラムを実行しても、私に「set()」を吐いてもらうのに時間がかかります。コード内でどこで問題が発生しているのかを指摘しました

提案やサンプルコードを探していて、ありがとうございました!

def compare(word1, word2, startDate, endDate): 
    with open('all_words.csv') as allWords: 
     readWords = csv.reader(allWords, delimiter=',') 
     year = set() 
     for row in readWords: 
      if row[1] in range(int(startDate), int(endDate)): #< Having trouble here 
       if row[0] == word1: 
        year.add(row[1]) 
     print(year) 
+0

希望の範囲の正確な行を知っていますか? – amin

+0

http://stackoverflow.com/a/29567902/1849366 –

+0

私はAminではありません、希望の開始日と終了日の入力を求めます。だから、彼らは何を入力するかによっていつも変わるでしょう – Blakester

答えて

3

テストはどんな年発見されていない理由は、表現されていること:

row[1] in range(int(startDate), int(endDate)) 

は、文字列値は、整数のリストに表示されるかどうかをチェックされます。テストした場合:

"1970" in range(1960, 1980) 

これはFalseを返します。次のように記述する必要があります。

int(row[1]) in range(int(startDate), int(endDate)) 

ただし、これはまだ非常に効率が悪いです。値int(row[1])がシーケンス[int(startDate), int(startDate)+1, ..., int(endDate)]のどこかで発生しているかどうかをチェックしています。これはリニア検索で行います。あなたのコードは、上記(範囲が第2引数を除くため)可能な日付のリストについては、endDateを除外するために書かれた

if int(startDate) <= int(row[1]) < int(endDate): 

注意し、私は上記の同じことをやった:はるかに高速になります。

編集:実際には、500000 in range(1, 1000000)のような式が非効率的なのはPython 2だと指摘しておきたいと思います。 Python 3(またはrangeの代わりにxrangeのところにあるPython 2)では高速です。

+0

日付が常に4桁の年であることが分かっている場合は、変換をスキップして「int」にすることができます。 – chthonicdaemon

1

パンダのライブラリread_csvの機能を試すことができます。この機能により、毎回望ましい量のデータを読み取ることができます。だからあなたはサイズの問題を克服することができます。

reader = pd.read_csv(file_name, chunksize=chunk_size, iterator=True) 

while True: 
    try: 
     df = reader.get_chunk(chunk_size) 
     # select data rows which have desired dates 
    except: 
     break 
    del df 
関連する問題