
Aleksey
14.01.2017
12:19:51
это, в плане, файл такого размера и надо его внутри отсортировать?
юзкейс неясен. а в целом, бенчи одинаковые будут, думаю, для всех достаточно низкоуровневых языков. узким местом станет, скорее, сама файловая система.

Дмитрий
14.01.2017
12:23:15
https://github.com/zerobias/filewrite-perfomance

Google

1
14.01.2017
12:25:07
Спасибо

Aleksey
14.01.2017
12:26:12
если хочется прям мегаоптимизации именно сортировки - сишник или Lua. да и js вполне. но IO вполне себе угробит любые оптимизации на хреновом железе/OS

Vladimir
14.01.2017
12:26:55
> @aleksxor
Lua
што?

1
14.01.2017
12:27:13
А сейчас более подробно опишу ситуацию. Есть множество файлов со строками. Таких файлов может быть несколько миллионов, а общее колличество строк стремится в нескольким десяткам миллиардов. БД на таких размерах и вообще стандартные методы сортировки просто не справляются. Сейчас есть алгоритм сортировки слиянием этих файлов, но хотелось бы написать что-то подобное на ноже и проверить проихводительность

Aleksey
14.01.2017
12:28:54

Vladimir
14.01.2017
12:29:40
Рекомендация для чего либо "сишник или Lua" выглядит абсурдно

Aleksey
14.01.2017
12:30:55
субъективно. для реализации алгоритма сортировки подходят оба. сишник если прямые руки. луа как, думаю, штука которая лучше всего остального умеет оптимизировать код

Andrew
14.01.2017
12:31:56

1
14.01.2017
12:32:20

Vladimir
14.01.2017
12:32:38
> @aleksxor
луа как, думаю, штука которая лучше всего остального умеет оптимизировать код
вот это абсолютный бред

1
14.01.2017
12:32:51
А что можете сказать касаемо алгоритма сортировки? Что еще кроме обычного слияния можно придумть?

Andrew
14.01.2017
12:34:02

Aleksey
14.01.2017
12:34:33

Google

1
14.01.2017
12:34:47

Andrew
14.01.2017
12:35:10
я так понимаю у тебя не просто набор этих файлов, а постоянно новые подливаются?

Vladimir
14.01.2017
12:35:21
и есть бенчмарки, которые подверждают что luajit быстрее чем все остальное вообще?

Andrew
14.01.2017
12:35:57
а строки какой длины?

Vint
14.01.2017
12:36:47

1
14.01.2017
12:36:52
Да. Подливаются сразу как только закончится обработка прошлой пачки данных, и чем быстрее это произойдет, тем лучше. Строки вида 123123:323123. Вотрировать нужно по первому числу

Andrew
14.01.2017
12:37:45
а пачка это сколько?

1
14.01.2017
12:37:56

Andrew
14.01.2017
12:38:11
т.е. у тебя есть некий набор данных, в файлах, строками, ты их отсортировал одноразово и все? потом следюущий набор внутри себя и так каждый раз?

1
14.01.2017
12:38:32

Andrew
14.01.2017
12:39:07
первое число насколько большим может быть?

Aleksey
14.01.2017
12:39:40

Vint
14.01.2017
12:39:52

Andrew
14.01.2017
12:40:10
а все это добро разом в оперативку влазит?

Aleksey
14.01.2017
12:40:16

Vladimir
14.01.2017
12:40:24
пруф?

1
14.01.2017
12:40:53

Andrew
14.01.2017
12:41:21
ну модули ядра на ноде на сях написаны, я не думаю что ты тупо на сях напишешь сильно оптимальнее, будет конечно оверхед некоторый, но не в разы я считаю

Google

Andrew
14.01.2017
12:41:42
обычный комп позволяет до 32 гигов спокойно поставить, и деньги не столь велики для подобных задач

1
14.01.2017
12:42:18

Andrew
14.01.2017
12:42:28
а не
тогда не вариант
но, если объём поделить, допустим, на 20, то он уже будет влезать в оперативку
т.е. за 20 итераций можно отсортировать 20 порций

1
14.01.2017
12:44:07
На порядок - это прям в 10 раз? Странно. Но в любом случае, это более оптимальный и удобный способ, если задача не разовая, а постоянная при поступлении новых данных. Я бы игрался с памятью и прочими оптимизация в PG. Вот такое 123123:323123 можно разбить на два поля, например, и следать int вместо текста.
Ну, не в 10, но в сроки не кладывается ни при каких оптимизациях. Конечно, можно докупить мощностей, но пока приходится обходиться тем, что есть

Andrew
14.01.2017
12:44:11
если их грамотно разложить по 20 файлам

1
14.01.2017
12:44:46
Ну, а потом только построчно, если так

Andrew
14.01.2017
12:44:51
да
в оперативе полюбому быстрее будет сортировка
а ключи дублируются?

1
14.01.2017
12:45:30
Да, первая часть будет повторяться и не раз

Andrew
14.01.2017
12:45:44
в таком случае как сортируешь при дублирующемся ключе?

1
14.01.2017
12:45:47
Вторая тоже, но их комбинация уникальна

Andrew
14.01.2017
12:45:48
или отбрасываешь?
значит там где первые совпали, надо по второму сортировать?

1
14.01.2017
12:46:45
Нет, только по первому
По крайней мере пока

Andrew
14.01.2017
12:47:22
я бы так сделал

Google

Vint
14.01.2017
12:47:23

Andrew
14.01.2017
12:47:30
берешь максимальное значение первого ключа
делишь его на 30

1
14.01.2017
12:47:43

Aleksey
14.01.2017
12:47:49
пруф?
https://gist.github.com/spion/3049314
как эталон.
там в комментах привели и крутую С версию, но кода и знаний чтобы ее написать, надо явно поболе чем для тупого алгоритма на луа

Andrew
14.01.2017
12:47:52
проходишь все файлы и раскладываешь строки по 30 файлам согласно диапазона ключей
дальше сортируешь отдельно каждый файл, благо он в память по идее должен взалить, если нет, тогда не 30 а 40 50 или 60
получаешь дцать файлов с отсортированным контентом внутри
по ходу отслеживаешь, если где-то файл начинает выходить за рамки лимита оперативки, бьешь на части дополнительно
в любом случае у тебя ключи разложатся в пределах диапазонов по файлам

Vladimir
14.01.2017
12:49:30

Admin
ERROR: S client not available

1
14.01.2017
12:49:48

Vint
14.01.2017
12:49:52
Весь
Печально. Читать исходники через stream и сравнивать с топом - было бы несложно. А так, весь result слишком жирный, в память не влезет.
Надо пытаться имплементировать максимально быстрый механизм external merge sort. Они уже описаны и есть готовые алгоритмы.

Aleksey
14.01.2017
12:50:29
увы, это плохой бенчмарк
удобная позиция )
по мне так, вообще, эталонный. четко показывает что писать шустрые пргоги на луа гораздо проще чем на сях

1
14.01.2017
12:51:13
Ну и последний вопрос, уточняющий: c++, luajit или нода?

Vladimir
14.01.2017
12:51:23
Я не знаю, как там полчилось у lua быстрее чем c и с++

1
14.01.2017
12:51:24
И да, всем спасибо за помощь

Andrew
14.01.2017
12:52:01
про луа не знаю

Vladimir
14.01.2017
12:52:04
Но в случае с луа и нодой как минимум во время включено время инициализации

Google

Aleksey
14.01.2017
12:52:04
легко. luajit очень хорошо умеет в оптимизацию. гораздо лучше среднего человека

Andrew
14.01.2017
12:52:15
как нода такие объёмы будет хавать тоже вопрос

Vladimir
14.01.2017
12:52:19

Andrew
14.01.2017
12:52:32
в любом случае пиши в файлы не построчно, а пачками, иначе на иопсах будешь большой оверхед иметь

Vladimir
14.01.2017
12:52:33
нода - не равно v8

Aleksey
14.01.2017
12:52:34
компилятор сам по себе в оптимизацию обычно не умеет

Vladimir
14.01.2017
12:52:40
-03 знаешь что такое?

Aleksey
14.01.2017
12:53:44
вот именно. а есть еще -01 и другое. к компилятору напрямую не относится
можно компилять без оптимизации, вообще

Vladimir
14.01.2017
12:54:13
можно, но так никто не делает

Aleksey
14.01.2017
12:55:45
оптимизация и компиляция разные процессы. luajit пишет Mike Pall. на мой вкус, самый способный. дотаточно глянуть на список оптимизаций которые luajit умеет

Aleh
14.01.2017
12:55:52

Vladimir
14.01.2017
12:56:11
и в него вложены десятки миллионов долларов

Aleksey
14.01.2017
12:56:41
так себе агрумент

Vladimir
14.01.2017
12:57:17
Конечно, один мужик в подвале может тоже самое сделать

Aleksey
14.01.2017
12:57:30
удобно чучело пинать?

Vladimir
14.01.2017
12:57:33
Но не суть - допустим lua быстрее C++
Осталось ответить на вопрос - почему
Без этого ответа наиболее вероятно, что это некорректный бенчмарк

Aleksey
14.01.2017
12:59:46
опять чучело пинаешь. я не говорил что луа быстре сей.
код на луа через luajit быстрее того что напишет средний сишный кодер. это наиболее близко к моей точке зрения.

Vladimir
14.01.2017
13:00:10
Луа быстрее в этом бенчмарке