Есть БД на postgresql. Есть Django скрипт который собирает данные.
Проблема в том что данных ОЧЕНЬ много. Таблица, с которой необходимо оперировать, содержит, по скромным подсчетам, - от сотен миллионов строк. И похоже - оперировать придется уже миллиардами.
Все частые запросы, - то что можно было закешировать, - я загнал в кеш redis.
Файлы для парсера - загоняются целиком в память и там делается парсинг для ускорения, поскольку файлы грузятся из сравнительно медленного соединения.
Парсеры с помощью celery грузят данные в несколько потоков.
Проблема в том, что на десятках миллионов запросы к админке уже начали отваливаться по таймаутам.
Скорость сбора данных - также оставляет желать лучшего. За полутора суток - собралось десятки миллионов данных - а должны собраться сотни.
Какие еще подходы можно применить для ускорения работы с большим объемом данных?
Структура таблицы с самым большим количеством данных имеет вид:
class CDRData(models.Model):
start_time_of_date = models.DateTimeField(null=True, blank=True)
origination_source_number = models.ForeignKey(ANIData, null=True, blank=True, verbose_name='ANI')
origination_destination_number = models.ForeignKey(DNISData, null=True, blank=True, verbose_name='DNIS')
routing_digts = models.CharField(max_length=32, null=True, blank=True)
origination_host = models.GenericIPAddressField(null=True, blank=True, verbose_name='TERMINATION_IP')
termination_host = models.GenericIPAddressField(null=True, blank=True)
termination_media_ip = models.ForeignKey(MediaIP, null=True, blank=True, verbose_name='TERMINATION_MEDIA_IP')
egress_response = models.ForeignKey(EgressResponse, null=True, blank=True,
related_name='d_egress_resp')
orig_term_release = models.CharField(max_length=32, null=True, blank=True)
egress_code = models.CharField(max_length=64, null=True, blank=True)
pdd = models.IntegerField(null=True, blank=True)
egress_call_duration = models.IntegerField(null=True, blank=True)
cdr_file = models.ForeignKey('ParsedFile', null=True, blank=True)
def __str__(self):
return '{} - {}'.format(str(self.origination_host), str(self.termination_host))
class Meta:
verbose_name = 'CDR data'
verbose_name_plural = 'CDR data'