都市の csv リストを Django アプリにインポートしています。私は Django と Python にかなり慣れていませんが、インポートはかなり速く実行されます。最初の 25,000 行には約 5 分かかり、次の 25,000 行には 2 時間かかります。インポートを停止し、中断したところから再開しました。次の 25,000 には約 4 分かかりました。挿入するたびに速度が低下しているように見えるので、明らかに間違っています。
どんな助けでも素晴らしいでしょう、私は主にデータをインポートするのではなく、学ぶためにこれをやっています.現在、postgresqlに直接インポートする方が速いので、プロジェクトを続けることができますが、私は何をしているのか知りたいです.間違っているので、Django / Pythonのいずれかを改善できます。
ティア
from myapp import Country, State, City
def add_country(isocode, name):
c = Country.objects.get_or_create(name=name.strip().replace('"', ''), isocode=isocode.strip())[0]
return c
def add_state(country, isocode, name, statetype):
country_model = Country.objects.get(isocode=country.strip().lower())
s = State.objects.get_or_create(name=name.strip().replace('"', ''), isocode=isocode.strip().lower().replace('"', ''), country=country_model, statetype=statetype.strip().replace('"', ''))[0]
return s
def add_city(country, state, name):
country_model = Country.objects.get(isocode=country.strip().lower().replace('"', ''))
try:
state_model = State.objects.get(name=state.strip().replace('"', ''), country=country_model)
except State.DoesNotExist:
state_model = None
ci = City.objects.get_or_create(name=name.strip().replace('"', ''), state=state_model, postcode='')[0]
return ci
with open('country.csv', 'rb') as csvfile:
myreader = csv.reader(csvfile, delimiter=',', quotechar='"')
for counrow in myreader:
add_country(counrow[0], counrow[1])
with open('state.csv', 'rb') as csvfile:
myreader = csv.reader(csvfile, delimiter=',', quotechar='"')
for counrow in myreader:
add_state(counrow[0], counrow[1], counrow[2], counrow[3])
with open('city1.csv', 'rb') as csvfile:
myreader = csv.reader(csvfile, delimiter=',', quotechar='"')
for counrow in myreader:
add_city(counrow[0], counrow[1], counrow[2])
with open('city2.csv', 'rb') as csvfile:
myreader = csv.reader(csvfile, delimiter=',', quotechar='"')
for counrow in myreader:
add_city(counrow[0], counrow[1], counrow[2])
with open('city3.csv', 'rb') as csvfile:
myreader = csv.reader(csvfile, delimiter=',', quotechar='"')
for counrow in myreader:
add_city(counrow[0], counrow[1], counrow[2])
更新:
コードを一括挿入を使用するように変更しました。最初の都市のグループは 2 分強になり、2 番目のロットは 10 分になりました。3 番目のグループは数時間経っても終了していません。なんらかのガベージ コレクション プロセスか、私が見逃しているものがあるに違いありません。ファイルを入れ替えても、各ファイルが最初に実行されるときは同じ時間がかかります。
新しいコードは次のようになります。
def add_country(isocode, name, created_by, changed_by, country_list):
country_list.append(Country(name=name.strip().replace('"', ''), isocode=isocode.strip()))
def add_state(country, isocode, name, statetype, created_by, changed_by, state_list):
country_model = Country.objects.get(isocode=country.strip().lower())
state_list.append(State(name=name.strip().replace('"', ''), isocode=isocode.strip().lower().replace('"', ''), country=country_model, statetype=statetype.strip().replace('"', '')))
def add_city(country, state, name, created_by, changed_by, city_list):
country_model = Country.objects.get(isocode=country.strip().lower().replace('"', ''))
try:
state_model = State.objects.get(name=state.strip().replace('"', ''), country=country_model)
except State.DoesNotExist:
state_model = None
city_list.append(City(name=name.strip().replace('"', ''), state=state_model, postcode=''))
country_list = []
state_list = []
city_list = []
print "Countries"
print time.strftime("%H:%M:%S")
with open('country.csv', 'rb') as csvfile:
myreader = csv.reader(csvfile, delimiter=',', quotechar='"')
for counrow in myreader:
add_country(counrow[0], counrow[1], adminuser, adminuser, country_list)
Country.objects.bulk_create(country_list)
print "States"
print time.strftime("%H:%M:%S")
with open('state.csv', 'rb') as csvfile:
myreader = csv.reader(csvfile, delimiter=',', quotechar='"')
for counrow in myreader:
add_state(counrow[0], counrow[1], counrow[2], counrow[3], adminuser, adminuser, state_list)
State.objects.bulk_create(state_list)
print "Cities 1"
print time.strftime("%H:%M:%S")
with open('city1.csv', 'rb') as csvfile:
myreader = csv.reader(csvfile, delimiter=',', quotechar='"')
for counrow in myreader:
add_city(counrow[0], counrow[1], counrow[2], adminuser, adminuser, city_list)
City.objects.bulk_create(city_list)
print "Cities 2"
print time.strftime("%H:%M:%S")
city_list = []
with open('city2.csv', 'rb') as csvfile:
myreader = csv.reader(csvfile, delimiter=',', quotechar='"')
for counrow in myreader:
add_city(counrow[0], counrow[1], counrow[2], adminuser, adminuser, city_list)
City.objects.bulk_create(city_list)
print "Cities 3"
print time.strftime("%H:%M:%S")
city_list = []
with open('city3.csv', 'rb') as csvfile:
myreader = csv.reader(csvfile, delimiter=',', quotechar='"')
for counrow in myreader:
add_city(counrow[0], counrow[1], counrow[2], adminuser, adminuser, city_list)
City.objects.bulk_create(city_list)