Sobes.tech
Back to questions
Senior
3

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

Companies where asked
Позитив Технолоджис

Answer from AI

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')

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