Sobes.tech
Назад к вопросам
Senior
5

Как эффективно по памяти выгрузить большой объём данных из БД, сформировать файл и отдать фронту? Можно ли использовать сжатие?

Компании, где спрашивали
Позитив Технолоджис

Ответ от нейросети

sobes.tech AI

Чтобы эффективно выгрузить большой объём данных из базы, не перегружая память, стоит использовать потоковую обработку (streaming) или пагинацию, то есть загружать данные порциями (batch) и сразу писать их в файл, не держа весь объём в памяти.

Пример подхода:

  • Использовать курсор или пагинацию для выборки данных по частям.
  • Для каждой порции данных сразу записывать в файл (например, CSV или JSON).
  • По возможности использовать сжатие на лету, например gzip, чтобы уменьшить размер файла и снизить нагрузку на сеть при отдаче фронту.

Да, сжатие можно и рекомендуется использовать, особенно для больших файлов. Это уменьшит трафик и ускорит передачу данных. Например, можно создавать gzip-архив в процессе записи файла, не сохраняя несжатый вариант на диск.

Пример на Python с использованием генератора и gzip:

import gzip
import json

def fetch_data_in_batches(cursor, batch_size=1000):
    while True:
        batch = cursor.fetchmany(batch_size)
        if not batch:
            break
        yield batch

with gzip.open('output.json.gz', 'wt', encoding='utf-8') as f:
    for batch in fetch_data_in_batches(db_cursor):
        for record in batch:
            f.write(json.dumps(record) + '\n')

Таким образом, память используется эффективно, а файл сразу создаётся в сжатом виде.