Я создаю веб-приложение 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)