私は300万以上のアイテム行を持つtsvファイルを持っています。そこには、各Itemにid、group、およびurlがあり、groupカラムがソートされます。Pythonで数百万の画像URLを効率的にチェックする
すなわち
x1 gr1 {some url}/x1.jpg
x2 gr1 {some url}/x2.jpg
x3 gr2 {some url}/x1.jpg
私はPythonスクリプトにそれをロードし、データベースにそれらの項目をロードする前に、グループのすべての項目のURLのステータス200 OKかどうかを確認する必要があります。私はプロセスを使用し、それぞれについてURLチェックを行うことを考えました(これはあまり良い経験ではありません)。
私のロジックatm:配列a1をgr1 - > a1の各項目を新しいプロセスに渡す - >プロセスが200をチェック - > a2の配列に入れる - > a1のすべての項目をチェックしてa2をDBにプッシュする(他のものと共に) - > repeat
これは100,000アイテムの場合、30分を要します。ボトルネックはURLチェックです。 URLをチェックせずに、スクリプトは比較して速いです。これまでのところ:
import csv
import re
import requests
import multiprocessing
from pymongo import MongoClient
import sys
#Load in Data
f = open('../tsvsorttest.tsv', 'rb')
reader = csv.reader(f, delimiter='\n')
#Get the first group name
currGroup = re.split(r'\t', next(reader)[0].decode('utf8'))[1]
currGroupNum = 0
items = []
checkedItems = []
#Method that checks the URL, if its 200, add to newItems
def check_url(newitem):
if requests.get(newitem['image_url']).status_code is 200:
print('got an ok!')
checkedItems.append(newitem)
global num_left
num_left -= 1
def clear_img(checkitems):
for thisItem in checkitems:
p = multiprocessing.Process(target=check_url(thisItem))
p.start()
#Start the loop, use i to keep track of the iteration count
for i, utf8_row in enumerate(reader):
unicode_row = utf8_row[0].decode('utf8')
x = re.split(r'\t', unicode_row)
item = {"id": x[0],
"group": x[1],
"item_url": x[2]
}
if currGroup != x[1]:
y = len(items)
print('items length is ' + str(y))
#Dont want single item groups
if y > 1:
print 'beginning url checks'
num_left = len(items)
clear_img(items)
while num_left is not 0:
print 'Waiting'
num_left = 0
batch = {"vran": currGroup,
"bnum": currGroupNum,
"items": newItems,
}
if len(checkedItems) > 0:
batches.insert_one(batch)
currGroupNum += 1
currGroup = x[1]
items = []
checkedItems = []
items.append(item)
if i % 100 == 0:
print "Milestone: " + str(i)
print "done"
その他の考慮事項:などに30個の別々のTSVファイルを元Tsvをを分割して並列にバッチスクリプトを30回実行します。これは違いをもたらすだろうか?
イメージが「通常の」Webサーバーから要求された場合は、GET要求ではなくHEADを実行できます。 –
ああ、それは助けてくれるだろう、私はそれを行かせるだろう。 –
Webサーバーからの応答を取得する非同期の性質は、CPUコア全体にタスクを分散することをより重視するマルチプロセッシングライブラリには適していません。ワーカープールのサイズを大幅に増やして、ここにあるすべてのI/Oバウンドブロッキングを許可したいと思うかもしれません。 – paddy