Как обработать и скачать очень большой файл? - PullRequest
0 голосов
/ 21 октября 2018

Мне интересно, какой подход к решению проблемы

:

  • У меня есть веб-API, который может принимать запросы от клиента
  • Уровень API говоритна бизнес-уровень, а затем на уровень данных
  • Уровень данных Получает огромный набор записей (5000000 строк), теперь бизнес-уровень обрабатывает столбцы и строки (используя максимальные потоки процессора)
  • после обработкиAPI передает содержимое в виде excel / csv клиенту (браузеру)

Сейчас вся загрузка происходит в одном потоке (запуск и ожидание готовности ответа)

IЯ хотел бы изолировать эту огромную бизнес-операцию обработки 5000000 строк в отдельном механизме или очереди задач (я не хочу, чтобы мой веб-сайт выпадал из-за нехватки памяти), а также я бы хотел, чтобы взаимодействие с пользователем было гладким.

Попытка использовать сервер push-событий / сигнализатора / или длинный опрос браузера, чтобы я мог отправить файл, как только данные / файл обработаны и готовы.

Есть ли лучший способ добиться этого?тот же самый?

1 Ответ

0 голосов
/ 22 октября 2018

Вот несколько предложений, основанных на том, что я могу понять

  1. Сериализация. Я бы не рекомендовал отвечать форматом CSV или Excel для такого большого набора данных,если это не единственный формат, который может обрабатывать клиент.Если у вас есть некоторый контроль над рабочим процессом, я бы изменил клиент так, чтобы он принимал формат, такой как JSON, или, что еще лучше, пошел бы на еще более оптимизированные сериализаторы, обеспечивающие скорость передачи данных и данные, такие как ProtoBuff, Avro, Thrift и т. Д.
  2. Разбиение на страницы. (Предполагая, что вы можете реализовать вышеупомянутое предложение.) Обычно ответные действия с большими данными могут снизить производительность по всем направлениям.Очень часто API принимает параметры для определения номера страницы и размера страницы.В вашем случае вы можете создать уникальный ссылочный идентификатор для запроса (например, «query-001», который можно вызывать при /api/query/001?page=10&items-per-page=10000).
  3. Кэширование. Если запросделается часто, чтобы уменьшить количество попаданий на уровень данных при каждом запросе (например, при запросе разных страниц).Вы можете либо загрузить данные на диск, либо сохранить данные в памяти.Хранение кэша значительно улучшит производительность, а также уменьшит сложные проблемы с отладкой, когда речь идет о настройке производительности системы.
...