Как стать автором
Обновить

Челлендж по обработке миллиарда строк на Go: от 1 минуты 45 секунд до 4 секунд

Уровень сложностиСредний
Время на прочтение14 мин
Количество просмотров23K
Всего голосов 50: ↑48 и ↓2+62
Комментарии20

Комментарии 20

Тема форуме Lazarus, где подобное сделали на Паскале, но там человек бодался против Питона и не понял изначально почему у него не получается это реализовать нормально.

13 Гб нельзя прочитать за 4 секунды на обычном диске. Даже чтобы передать это по сети, потребуется полоса порядка 35 Гбит/с
Это к вопросу, нужно ли так оптимизировать код, если железо все равно нужно апгрейдить, чтобы этот код запустить

  1. Диск может быть необычный. "Берем пачку обычного порошка и 5 грамм необычного...".

  2. Кеширование

  3. Человек только изучает, похлопайте и не приставайте с нудятиной (типа сброса файлового кеша, размера страниц... ойвсё)

  4. Тем более это перевод

  5. Тем более от PatientZero. Оно уже в кассу сходило и свое получило, поздно метаться.

А это может не с диска быть, а из другой части программы. Или от другой программы через stdin.

Обычный диск это какой? Нынче у всех почти SSD, которые могут 7+ГБ\с читать легко новые если. Ну и автор, конечно, запускал пару раз и весь файл улетал в кеш в оперативке, да.

SSD M2 диски пока к обычным вроде не относят, обычные = SATA (а это в пике 540 Мб/с, обычно 300-400 Мб/с - но да, с одного диска, а не RAID массива). И чтение этого объема данных из оперативной памяти тоже некоторое время занимает ("Пропускная способность памяти DDR4 в перспективе может достигать 25,6 ГБ/c").
Конечно, можно всю файловую систему в оперативной памяти держать, проблем нет. Но вот автор утверждает "Я уже разобрался, что дисковый ввод-вывод не становится узким местом" - это как раз вызывает вопросы, ибо на таком объеме дисковый ввод/вывод является самым узким местом )

SSD M2 диски пока к обычным вроде не относят, обычные = SATA

Гм. Почему? У меня SATA SSD не осталось давно - это бессмысленно т.к. шина в 10-15 раз медленнее диска. И в ноуте и в десктопе NVMe.

Ибо на таком объеме дисковый ввод/вывод является самым узким местом

При первом запуске - да, при последующих - уже нет. Для задач оптимизации кода этого достаточно.

вы подотстали от жизни ;) сата сегодня устаревшая технология, никто толком не выпускает новые "диски". даже в моей материнке 10-и летней давности есть pci-e m2 и он работает в режиме PCI express 2, но это потому, что у меня еще видеокарта есть дискретная и она занимает шину PCI express 3. А так с обычным переходником “разветвителем” моя десятилетняя мать (без видеокарты) тянет m2 в PCI express 3 на скорости под 3.7 Гб Сек если мне не изменяет память. А сегодня продаются и PCI express 4 накопители.

Сам думал что комп старый, куплю простой SSD - а оказалось что они не дешевле, не обновляются давно и встречается брак даже в самсунгах. И это полтора года назад уже была такая картина.

Молодец мальчик(девочка), ты правильно посчитал ограничения для запуска сервера на 13 миллионов пользователей на твоем ноутбуке. Жаль что жизнь выглядит немного иначе.

Это просто такое упражнение на программирование, ясное дело что практическая ценность такого решения околонулевая, тут можно много до чего докопаться, но вроде бы никто и не говорил что это практическая задача. Это все равно что к гонщикам прицепиться с претензиями что их машины не похожи на обычные "гражданские", траектория трассы очень странная и редко встречается на реальных дорогах, да и вообще попробуй так покатайся по улицам города и тебя полиция быстро скрутит..

Можно ведь еще и про источник этих данных подумать - наверняка эти измерения не проводятся каждую миллисекунду, они делаются с довольно большим временным лагом, потому что температура это параметр, который меняется довольно медленно, с большой инерцией, и просто нет смысла делать замеры слишком часто, а с задачей подсчета статистики раз в пять минут, справится даже бабушка со счетами и бумажным "Журналом наблюдений"..

В общем можно долго докапываться, если не понимать что это искусственная задача для того что-бы люди могли поразвлекаться с оптимизациями и сравнить их результаты.

Perl, Pentium-100, несколько миллионов строк лога, секунд 4-5 (не успел засечь).
Но исследование интересное, автору - респект.

Господа, я в питоньих делах ничего не смыслю, пытался создать файл в 1 млрд строк и вот что оно мне пишет (файлы взяты с GitHub):

C:\Temp\2>create_measurements.py 1000000000
Traceback (most recent call last):
File "C:\Temp\2\create_measurements.py", line 158, in <module>
main()
File "C:\Temp\2\create_measurements.py", line 151, in main
weather_station_names = build_weather_station_name_list()
                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Temp\2\create_measurements.py", line 46, in build_weather_station_name_list
file_contents = file.read()
                ^^^^^^^^^^^
File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.11_3.11.2288.0_x64__qbz5n2kfra8p0\Lib\encodings\cp1251.py", line 23, in decode
return codecs.charmap_decode(input,self.errors,decoding_table)[0]
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
UnicodeDecodeError: 'charmap' codec can't decode byte 0x98 in position 14718: character maps to <undefined>

У питона больно с кодировками, а там, где эта программа была написана и запускалась - нет кодировки windows-1251, так что всё просто работает.
Для исправления в строках с "with open" надо добавить еще один параметр:
with open("measurements.txt", 'w', encoding='utf8') as file:

Спасибо. Странно что так реализовано ведь в описании на Github они сами пишут что кодировка utf8

На linux - utf-8 по-умолчанию уже давно.

ну питон кроссплатформенный и странно писать привязываясь к линуксу особенно в java дисциплине

Язык - кроссплатформенный. А вот кодировки по-умолчанию всё ж различаются и это надо учитывать, явным образом указывая. Ну или использовать всегда ascii

Кроме того, просто интересно писать код, выжимающий из машины максимум.

Думаю этот аргумент самый сильный :)

Код даже не читал.
Обработать миллиард строк за 4 секунды невозможно на обычном компьютере. Если мы читаем допустим ровно минуту и одновременно обрабатываем, что дает нам результат за 1:04 - это не 4 секунды.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории