ПРОХОД
Позже сервис будет интегрирован с существующим бэкэндом Spring Boot.
В настоящее время я загружаю файл Excel/CSV (до 700 тыс. строк) из пользовательского интерфейса, который содержит данные опций, для которых мне нужно вычислить греки.
Я использую:
- FastAPI → сервер асинхронного API (для потоковой передачи ответа)
- Pandas → манипулирование данными, чтение Excel/CSV
- NumPy → векторизованная математика
- SciPy → вычисления Блэка-Шоулза и Грека
- orjson → быстрая сериализация JSON
- ProcessPoolExecutor → для параллельной обработки на основе блоков
Разделение на фрагменты – около 20 000 строк на фрагмент
Параллельные вычисления (ProcessPoolExecutor)
Векторизованные вычисления Блэка-Шоулза с использованием NumPy
Проверка ошибок (NaN, отрицательные значения, несовпадения типов)
Преобразуйте результаты в диктовку и вычислите агрегаты
Объедините результаты — объедините все выходные данные фрагментов и итоговые значения
Сериализация и потоковая передача — используйте orjson и StreamingResponse
Ниже приведена моя диаграмма производительности, время ответа для 700 тысяч записей в Excel сейчас составляет 9–11 секунд
Код: Выделить всё
### 700k Rows
| Configuration | Read File | Calculate | Build Results | JSON | Total |
|---------------------|-----------|-----------|---------------|------|--------|
| **Single Process** | 1-2s | 5-6s | 8-10s | 3-4s | 17-22s |
| **4 Workers** | 1-2s | 3-4s* | 3-4s* | 3-4s | 10-14s |
| **8 Workers** | 1-2s | 2-3s* | 2-3s* | 3-4s | 8-12s |
*Parallel processing time (multiple chunks at once)
### 60k Rows
| Configuration | Total Time | Notes |
|---------------------|------------|------------------------------------|
| **Single Process** | 2-3s | No overhead, pure speed |
| **4 Workers** | 3-4s | ⚠️ Overhead > benefit |
| **8 Workers** | 4-5s | ⚠️ Too much overhead
Идеально ли использовать рабочие процессы в этом API, поскольку они занимают приличный объем памяти и могут повлиять на сервер, используют ли люди его в производстве и о чем следует помнить?
Является ли мой технический стек (FastAPI + Pandas + NumPy + SciPy) + orjson) подходит для этого типа рабочей нагрузки, или мне следует рассмотреть что-то другое (например, Polars, Cython или PyPy)?
Помимо накладных расходов на сериализацию JSON, есть ли другие узкие места, о которых мне следует знать (например, межпроцессное взаимодействие, GIL или блокировка ввода-вывода)?
Буду признателен за любую помощь
Подробнее здесь: https://stackoverflow.com/questions/798 ... astapi-ser
Мобильная версия