способы ускорить. TXT к БД в Django - PullRequest
0 голосов
/ 26 сентября 2019

У меня есть такой текстовый файл:

AN  AD  Aixas
AN  AD  Aixirivall
AN  AD  Aixovall
AN  AD  Ansalonga

И я хочу импортировать этот текстовый файл в базу данных.Я делаю это так.

fips_codes = []
        iso_codes = []
        city_names = []

        for line in city_file.readlines():
            cc_fips = line[:2]
            cc_iso = line[3:5]
            name = line[6:]

            fips_codes.append(cc_fips)
            iso_codes.append(cc_iso)
            city_names.append(name)

        counter = 0
        for item in fips_codes:
            country = Country.objects.get(cc_fips=fips_codes[counter], cc_iso=iso_codes[counter])
            city_object = City(country=country, name=city_names[counter])
            city_object.save()
            counter = counter + 1

Есть ли способ ускорить этот процесс?

Ответы [ 2 ]

0 голосов
/ 27 сентября 2019

Прежде всего, попробуйте ограничить вызовы базы данных.Количество стран относительно невелико, поэтому вы можете загрузить все страны одновременно и создать карту из кодов fips / iso для идентификаторов стран:

countries = {
    (c.cc_fips, c.cc_iso): c.id
    for c in Country.objects.all()
}

Затем создайте массовые города:

cities = []
for line in city_file.readlines():
    fips, iso, name = line.split()
    cities.append(
        City(country_id=countries[(fips, iso)], name=name)
    )
City.objects.bulk_create(cities)

Если количество городов очень велико, вы можете сохранять города кусками, например, каждые 100 городов, чтобы не хранить в памяти все объекты городов.

0 голосов
/ 27 сентября 2019

Нет необходимости повторять цикл дважды

for line in city_file.readlines():
    fips, iso, name = line.split()
    country = Country.objects.get(cc_fips=fips, cc_iso=iso)
    City.objects.create(country=country, name=name)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...