Ответы пользователя по тегу Go
  • Какой можно применить алгоритм для хранение индекса для 50 миллиардов записей в golang?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Немного бухгалтерии. Если взять по максимуму.

    Размер одной записи должен быть порядка 60 + 32 +8 = 100 символов (байт для простоты)

    При 50 млрд записей объем хранимых данных должен быть порядка

    50 000 000 000 * 100 = 5 000 000 000 000 = 5 триллионов байт.

    В дисковом хранении это будет примерно 4.5 терабайта. Задачка для in-memory неподъемная. Нужен диск + мемори.

    Если я там где-то ошибся в расчетах - то только в средних значениях. Если подставить не максимумы а среднее - то цифры будут поскромнее. Но в любом случае - многовастенько для покупки памяти.

    Вобщем нужна дисковая БД которая встраивается в приложение. На требование менеджеров которые запретили использовать БД забейте. Они ничего не понимают. Делайте БД встраиваемую в приложение. В качестве таких (встраиваемых систем можно поробовать) LevelDb, BerkeleyDb, RocksDb. Они поддерживают индекс класса B+Tree и это даст возможность искать группы записей по одному ID. Для этого класса систем любую запись можно найти за 4-5 дисковых IOPS. Если какдый IOPS стоит 15 мс (это я так мерял свой собственный магнитный HDD) то любой поиск группы ключей для TTFB будет порядка 15 * 5 = 75 милисекунд. Ну если вы поставите SSD - то быстрее.

    По поводу предложений хранить в файлах. До того как обсуждать это - надо уяснить требования по времени отклика. Сколько секунд вы согласны ждать - насколько можно и партицировать (или шардировать ваш файл).
    В простейшем случае мы делим большой CSV файл на 512 partitions по хешу от ID и получаем соотв время фулл-скана всего файла поделенное на 512. Дальше - играйтесь с этим параметром партишенинга выводя его на доступный уровень отклика. Из недостатков - будет россыпь файлов. Надо почиать документацию на вашу файловую систему (ext4?) и тюнить ее так чтоб она не сдохла от такого числа inodes.

    Я поддержу оба сценария. И с встраиваемой БД и с файлами. Но с БД надежнее т.к. есть транзакции а файлы у вас могут быть в крешнутом состоянии долго. И вы об этом ничего знать не будете.

    По поводу Parquet. Не взлетит. Скорее всего индекс по данному типу файла - это совсем не то что вкладывают туда релационные системы. Обычно Parquet/Orc/Delta вкладывают в индекс смысл - отбрасывания тех полосок данных (stripes) которые бесполезны при чтении всего файла. Такой индес - обычно просто либо range-признак либо карта Блума. И в случае с range - дает эффект на сортированных данных. Для прочих - будет бесполезно т.к. фулл-скан все равно обеспечен. А если фулл-скан то зачем тогда вообще индекс.

    Вобщем для дизайна архитектуры нам нужны цифры. Средние длины по колонкам. И я-бы еще запросил кардинальность по полю ID.
    Ответ написан
    7 комментариев
  • Как правильно указать тип?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Вынеси всю одинаковость в новую функцию. Обработки ошибок и прочее. А кастомные вещи пускай будут в специальных функциях TaskLocal, TaskRemote. Там у тебя останется 5 строчек (я так думаю).
    Ответ написан
    Комментировать
  • Как обрезать json до определённого тега?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Есть строка джсона длинной 25000+ строк.

    Это какая-то ерунда. JSON - это никакая не стркоа. Это JavaScript object notation. Собственно это заложено в аббревиатуру. И работать с ним надо через API который работает с JSON.

    Игры со строками ни к чему хорошему не приведут. Пропустишь escaping и будет просто зря потраченное время и забаговнный код.
    Ответ написан
    Комментировать
  • Как правильно прописать код в Docker?

    mayton2019
    @mayton2019
    Bigdata Engineer
    У тебя в какой папке лежит app?
    Ответ написан
  • Можно ли делать так чтобы константный текст брался на этапе "(пре)компиляции" из фаила который не являеся source code?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Совершенно непонятно зачем это надо? Константы можно просто объявлять в исходнике.

    Тут зря автор смешал в кучу теги Go и С++. Это слишком разные философии разработки.
    Я-бы сказал что в Go многие вещи сознательно упрощаются или выбрасываются. И обсуждать
    вот так вот просто через запятую Go и С++ немыслимо.

    Даже термин пре-компилляция уже вызывает такой себе диссонанс. От пре-процессора сознательно
    уходят в современных языках. И на него не стоит обращать внимание. Он - рудимент.
    Ответ написан
    1 комментарий
  • Жизненный цикл Go?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Обычно на Go пишут микросервисы. А они не должны умирать. Как раз совсем наоборот должны работать очень долго.
    Ответ написан
  • Как в Golang проверить вхождение строки в строку, но слово целиком?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Тут - совокупность проверок
    1) strings.Contains - даст положительный результат
    2) по бокам от найденного Contains должны стоять не-алфавитные символы.

    P.S. Это можно делать регулярками но я-бы предложил мой метод. Он кажется легче в понимании.
    Ответ написан
    Комментировать
  • Перед выполнением в цикле exec.Command желательно "разогреть"?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Скорее всего ничего тут поделать нельзя. Под windows процессы стартуют медленнее чем под Linux.

    Попробуй ради интереса замени PING на DIR и посмотри как изменится время.
    Ответ написан
  • Почему простой цикл на c++ выполняется медленнее, чем на golang?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Судя по скриншоту это windows. Если вы делаете бенчмарки под windows - то нужно правильно мерять время. Скорее всего вы меряли не время цикла а время запуска windows процесса + время цикла. Вместе с статическими конструкторами. И эти конструкторы в go оказались удачнее.

    Короче вы не втом месте включали секундомер. А то так можно и доказать что PHP быстрее чем C++.
    Ответ написан
    2 комментария
  • Как пользоваться перл синтаксом регулярных выражений в го?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Возможно ему не нравятся named groups.

    Попробуй как то так

    2) [Xx]\^(\d)
    3) (?<!\^)([+-])? ?(\d+.?\d*)
    Ответ написан
    Комментировать
  • Как подключитЬся с помощью Golang к другой программе?

    mayton2019
    @mayton2019
    Bigdata Engineer
    и считывать данные с неё( программа 1с если это важно)

    Источником данных для 1С обычно выступает БД. Вот оттуда и надо считывать.
    С приложения - сомнительная затея IMHO.
    Ответ написан
  • В каких случаях стоит использовать ORM в go?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Я-бы начинал без всяких ормов. Тем более что Go исповедует философию простоты. А потом затащить Орм если надо.
    Ответ написан
    Комментировать
  • Верно ли то что в go нет конкретной структуры проекта?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Скорее всего это связано с отсуствием сборщика. Именно он диктует определенную структуру например сорцов и тестов. Конфигов и таргет каталогов.
    Ответ написан
  • Что такое монадическая обработка ошибок?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Интересно обратываются ошибки I/O в Rust. Там такой синтаксис что ты не можешь получить результат не обработав ошибку. Является ли это монадической схемой? ХЗ.
    use std::fs;
    
    fn main() {
        let data = fs::read_to_string("/etc/hosts").expect("Unable to read file");
        println!("{}", data);
    }

    В других языках можно как-то проскочить между капелек дождя. Просто не делать секцию catch(exception) а здесь компиллятор просто не соберет код без except().

    Есть еще другой более красивый кейс с Rust но я его не найду никак.
    Ответ написан
    1 комментарий
  • Кто мне объяснить как работает шейпинг трафика с помощью proxy?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Алгоритмически - это буфер типа FIFO. С одной стороны заходят IP пакеты. С другой стороны они выходят с задержкой так чтобы средний объем трафика за единицу времени не превышал лимит.

    Это была теория. Практически шейперы кодят на С или С++.

    Сомнительно чтобы эффективный шейпер можно было сделать на Питоне.
    Ответ написан