Является ли PostgreSQL (через ElephantSQL) гораздо более медленной базой данных, чем SQLite Django, и что с этим делать? - PullRequest
0 голосов
/ 11 декабря 2019

Я создаю веб-приложение Django, включающее представление, которое может загружать данные в базу данных через csv-import. Каждый импорт содержит около 2000 строк и 9 столбцов с DecimalFields и CharFields. До сих пор я использовал базу данных SQLite от Django, и каждая загрузка занимала у меня максимум 1 минуту. Я переключился на PostgreSQL (размещенный через ElephantSQL), и теперь загрузка занимает не менее 10 минут. Я читал в некоторых постах, что SQLite работает быстрее, чем PostgreSQL, но я не ожидал ничего такого. Есть ли способ ускорить процесс загрузки в PostgreSQL? Я подумал, что одной из причин низкой скорости может быть то, что я использую бесплатный Tiny Turtle Plan от ElephantSQL, но если я правильно понимаю, несвободные планы отличаются только с точки зрения максимального размера базы данных, но не ее скорости? См. Также здесь https://www.elephantsql.com/plans.html

Может ли быть решением установить локальный PostgreSQL вместо использования облачного провайдера? Есть ли что-нибудь еще, что я могу оптимизировать, чтобы ускорить процесс?

моя модель:

class Testdata3(models.Model):
    key = models.CharField(max_length=100, primary_key=True)
    mnemonic = models.CharField(max_length=50)
    assetclass = models.CharField(max_length=50)
    value = models.DecimalField(max_digits=255, decimal_places=25)
    performance = models.DecimalField(max_digits=255, decimal_places=25)
    performance_exccy = models.DecimalField(max_digits=255, decimal_places=25)
    performance_abs = models.DecimalField(max_digits=255, decimal_places=25)
    performance_abs_exccy = models.DecimalField(max_digits=255, decimal_places=25)
    date = models.DateField()

    def __str__(self):
        return self.key

мой взгляд:

def file_upload(request):
    template = "upload.html"
    prompt = {
        'order': 'Order of the CSV should be "placeholder_1", "placeholder_2", "placeholder_3" '
    }

    if request.method == "GET":
        return render(request, template, prompt)

    csv_file = request.FILES['file']

    if not csv_file.name.endswith('.csv'):
        messages.error(request, 'This is not a csv file')

    data_set = csv_file.read().decode('UTF-8')

    io_string = io.StringIO(data_set)

    #Ignores header row by jumping to next row
    next(io_string) 

    for column in csv.reader(io_string, delimiter=';', quotechar="|"):
        # Check if csv-row is empty, if true jump to next iteration/row
        if all(elem == "" for elem in column):
            next
        else:
            _, created = Testdata3.objects.update_or_create(
                key = column[0],

                defaults = {
                'key' : column[0],
                # Get everything after the date part in the primary key
                'mnemonic': re.findall(r'AMCS#[0-9]*(.*)', column[0])[0],
                # Create datetime object from a string
                'date' : datetime.datetime.strptime(column[6], '%d/%m/%Y'),
                'assetclass' : column[10],
                'value' : column[16], 
                'performance' : column[19],
                'performance_abs' : column[20],
                'performance_abs_exccy' : column[30],
                'performance_exccy' : column[31],
                }
            )
        context = {}

    return render(request, template, context)
...