Git Product home page Git Product logo

pt_test's Introduction

Проект по фильтрации и отправки данных по http

Данные предоставляются в виде текстового файла, каждая строка которого 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 Оперативная память, в МБ

По завершению исполнения работы утилиты, необходимо, вывести:

  1. количество переданных строк
  2. объем в bytes переданных строк
  3. количество пропущенных строк
  4. объем в 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 модулей для решения.

Run locally

  • Install dependencies

    poetry install --no-root --with dev
    
  • Generate sample data sample/sample.txt with custom model sample_model.json and random data

    python 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
    

Run in docker (cli args in Dockerfile)

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 строк, который прошли и не прошли фильтр.

pt_test's People

Watchers

Adilet avatar

Forkers

andrewfomaru

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.