26,00,000行と4列からなるcsvファイル(692 MB)から10,00,000行を読み込む必要があります。複数のスレッドではそれぞれがランダムから始まりますPythonで無作為な線から始まるCSVファイルを読む
from multiprocessing.pool import ThreadPool as Pool
import linecache
import random
import csv
from random import randint
from time import sleep
csvfile=csv.reader(open('sample.csv'))
def process_line(l):
sleep(randint(0,3))
print (l)
def get_random_line():
lines_to_get=random.randint(0,2600000)
line = linecache.getline('sample.csv', lines_to_get)
for lines_to_get, line in enumerate(csvfile):
print (line)
if lines_to_get >= 1000000:
break
yield (line)
f = get_random_line()
t = Pool(processes=3)
for i in f:
t.map(process_line, (i,))
t.close()
しかし結果で、ラインは、それが最初の行自体から毎回起動、ランダムからスタートされていません:。私は100万回線に達する
私の試みを行および停止
結果
['1', '31', '2.5', '1260759144']
['1', '1029', '3.0', '1260759179']
['1', '1061', '3.0', '1260759182']
['1', '1129', '2.0', '1260759185']
['1', '1172', '4.0', '1260759205']
['1', '1263', '2.0', '1260759151']
['1', '1287', '2.0', '1260759187']
['1', '1293', '2.0', '1260759148']
['1', '1339', '3.5', '1260759125']
要件が厳しく、私はランダムなライン毎回
2600万行のファイルの中でランダムに10 x 100万のチャンクを読む必要があるのはなぜですか?ランダムな選択肢を調整するロジックを入れない限り、同じ行を何度も読む確率はかなり高いですし、それはもはやランダムではありません...とにかく、反復子を見て、読み込みプロセスをチョークして、実際にあなたが読んだこと必要。あなたが満足している方法で小さなプロセスを読み込むアルゴリズムを書いて、それが動作することを確認してから、サブプロセスまたはプール内の小さなチャンクリーダーを大量に読み込むことで問題を解決してください。 – ahed87
または依存関係を確認したら、pandasを見てください。同様の問題の定式化の例がここにあります(https://stackoverflow.com/questions/25962114/how-to-read-a-6-gb-csv-file-with-pandas)。 – ahed87
@ ahed87ありがとうございます。しかし、毎回ランダムなチャンクを取得する方法を教えてください。 – Najma