Senior
Come esportare efficacemente una grande quantità di dati dal database in memoria, generare un file e consegnarlo al frontend? È possibile utilizzare la compressione?
sobes.tech AI
Risposta dell'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')
Таким образом, память используется эффективно, а файл сразу создаётся в сжатом виде.