Данные предоставляются в виде текстового файла, каждая строка которого json (cтруктура такова, что могут быть вложенные структуры, но тип данных json "массив" - отсутствует), строки в файле - необязательно единой структуры. Файл может быть размера от 100MB до 32GB.
Необходимо подготовить проект(код), который считывает строки из данного файла и отправляет их по http на абстрактный сервис методом POST на заданный endpoint.
Необходимо учесть следующее моменты:
-p
,--path
путь до входного файла
-u
,--url
url абстрактного сервиса - куда отправляются данные.
-f
,--filter
Опциональный "фильтр". То есть опция может присутствовать или нет. В случае, если указать "фильтр", то код фильтрует строки(отправляются на сервис только те, которые соответствуют заданному фильтру). Например, есть строка во входном файле:{"values": {"a": 1, "b": "s", "c": true, "d": {"i": "a", "j": 100}}}
. В опции "фильтра" задается строкаvalues.d.j==90
- тогда код проект отправит в сервис только те строки из файла, где в соответсвующем поле в структуре установлено значение 90, или, например, в опции "фильтр" values.b=="s", тогда строка из примера выше пройдет фильтр и будет отправлена. В опции возможно только прямое равенство через ==, или как кандидат решит указать это в аргументах, не принципиально, важно по смыслу, что в при старте в код проекта может быть передано условие равенства ключа через путь в json какому-либо значению.
-l
,--limit
Опциональный аргумент отправлять в POST за раз 1 строку, или столько, сколько передано в аргументах при старте. То есть, в структуре(представлена далее) в ключе "data" отправляется 1 запись, или количество указанное через эту опцию. Структура отправляемых данных в абстрактный сервис:{ "timestamp": int, "data": [{record1}, {record2}...{recordN}] }
-o
,--output
Опциональный аргумент – путь до выходного файла, при указании данного аргумента в выходной файл пишутся строки, не прошедшие фильтр.
--vcpu
Количество ядер
--ram
Оперативная память, в МБ
- количество переданных строк
- объем в bytes переданных строк
- количество пропущенных строк
- объем в bytes пропущенных строк
Важно учесть, код проекта может исполняться в среде как с 1vCPU и RAM до 512MB, так и c NvCPU и RAM до 16GB
Помимо исполнения основных условий по проекту, код должен быть максимально производительным и соответствовать среде исполнения, среду исполнения можно определять самостоятельно, можно передавать в аргументах при старте кода, например, указывать
--vpcu=1 --ram=512M
Код проекта представить на github, в том числе: Dockerfile(docker-compose)
При решении проекта использовать chatGPT или другие ai coding assistant – не допускается.
В любом случае, по архитектуре проекта, и выбранных решениях на встрече будут вопросы. Использование сторонних библиотек допустимо в минимальных пределах. То есть, например, для сериализации json – допускается использовать сторонние библиотеки, равно как и http client – любой подходящий к решению задачи может быть. Но библиотеки и модули, комплексно решающие подвопросы в рамках проекта – не допускается. В python3 достаточно builе-in модулей для решения.
-
Install dependencies
poetry install --no-root --with dev
-
Generate sample data
sample/sample.txt
with custom modelsample_model.json
and random datapython sample/generate.py
-
Run main
python main.py -p sample/sample.txt -u https://httpbin.org/post -l 2 -o output/output.txt --vcpu 1 --filter parent.surname==Brown
docker build -t pt_test .
docker run -v $(pwd)/output:/app/output -v $(pwd)/sample:/app/sample -it pt_test
После завершения работы скрипта будет сгенерирован
- файл
sample/sample.txt
со строками в виде json, которые далее будут обработаны. Количество генерируемых строк можно указать вmain.py
в строке сgenerate_data(n_lines=...)
. - файл
output/output.txt
со строками, не прошедшими фильтрацию
В консоль будет выведена информация с количеством и размером в bytes строк, который прошли и не прошли фильтр.