русский
Germany.ruForen → Архив Досок→ Programmierung

Спецы ассемблера

1783  1 2 3 alle
alex445 коренной житель10.04.23 11:51
NEW 10.04.23 11:51 
in Antwort zavuch 10.04.23 10:12

Неужели эта очевидная оптимизация не встроена давно во все популярные СУБД? "Ну тупые!"

#21 
Muenchausen завсегдатай11.04.23 12:45
Muenchausen
NEW 11.04.23 12:45 
in Antwort 7495 09.04.23 09:01

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


Кстати есть оказывается тулза которая поддерживает таки миллиард строчек, но я еще не тестировал ее

Power BI от Microsoft – что это?

Я никогда не боялся быть смешным , это не каждый может себе позволить ...
#22 
Программист коренной житель11.04.23 18:23
NEW 11.04.23 18:23 
in Antwort Muenchausen 11.04.23 12:45
ооо, даже не верится, я когда то потратил денег на оптимизации баз, но ни на одном форуме никто не сказал да о возможности относительно быстрой сортировки базы в миллиард записей )) и пришлось тупо сесть и придумать решение самому, что я и успешно сделал. Но никому не скажу как ))

Это только я не понял задачу, которую хотел решить Muenchausen? :) Зачем сортировать лярд записей? В БД для быстрой сортировки придумали индексы...


Кстати есть оказывается тулза которая поддерживает таки миллиард строчек, но я еще не тестировал ее

Любая БД поддерживает лярд строчек. Даже есть все строчки пронумеровать обычным 32 разрядным интом, будет больше 4 лярдов строк...

#23 
alex445 коренной житель11.04.23 19:47
NEW 11.04.23 19:47 
in Antwort Программист 11.04.23 18:23
Зачем сортировать лярд записей? В БД для быстрой сортировки придумали индексы...

Кстати, да - сортируют обычно результат запроса.

#24 
Murr патриот11.04.23 20:02
Murr
NEW 11.04.23 20:02 
in Antwort Программист 11.04.23 18:23

Зачем сортировать лярд записей?

-----

В свете постановки задачи ТС некоторый смысл имеется.


В БД для быстрой сортировки придумали индексы...

-----

Угу... Вот только смысл в индексе по одноколоночной табличке? смущ

#25 
Murr патриот11.04.23 20:05
Murr
NEW 11.04.23 20:05 
in Antwort alex445 11.04.23 19:47

сортируют обычно результат запроса.

-----

Только не говори это ДБАшникам...

#26 
alex445 коренной житель11.04.23 20:47
NEW 11.04.23 20:47 
in Antwort Murr 11.04.23 20:05, Zuletzt geändert 11.04.23 20:48 (alex445)

Я сказал "обычно". Что там ДБАшники со своими индексами-оптимизациями делают меня не очень касается. Я всё равно потом результат пересортирую как мне надо.

#27 
Muenchausen завсегдатай12.04.23 07:38
Muenchausen
NEW 12.04.23 07:38 
in Antwort Программист 11.04.23 18:23

Тоесть имеем текстовый файл например 90 гиг, где база из двух столбцов, в первом 30 значный код , во втором дата , и таких строчек по моему 870 млн штук, сколько времени нужно чтобы просто отсортировать по тридцатизначному коду в порядке возрастания ?

Я никогда не боялся быть смешным , это не каждый может себе позволить ...
#28 
Программист коренной житель12.04.23 08:22
NEW 12.04.23 08:22 
in Antwort Murr 11.04.23 20:02
В свете постановки задачи ТС некоторый смысл имеется.

Да? :) Какой?


Вот только смысл в индексе по одноколоночной табличке? смущ

Отсортированная одноколоночная табличка - это фактически и есть индекс.

#29 
Программист коренной житель12.04.23 09:02
NEW 12.04.23 09:02 
in Antwort Muenchausen 12.04.23 07:38
Тоесть имеем текстовый файл например 90 гиг, где база из двух столбцов, в первом 30 значный код , во втором дата , и таких строчек по моему 870 млн штук, сколько времени нужно чтобы просто отсортировать по тридцатизначному коду в порядке возрастания ?

Еще раз, все зависит от того, что тебе нужно иметь на выходе.

Самое простое и быстрое решение:

1) создать БД

2) сделать табличку из 2- колонок (id и дата)

3) добавить индекс по колонке код

4) дальше просто считываешь все эти 870млн строк и добавляешь в БД.


Отсортированные данные готовы. Осталось их только выбрать: select * from <table> order by <id>. Ну очевидно, что 870млн строк за раз никому не надо, поэтому имеет смысл сделать вывод по частям: select * from <table> order by <id> offset X rows fetch next Y rows only (для MSSQL).


Сколько на это уйдет времени сказать не могу, но это будет не то, чтобы очень долго.


Другой способ - создать индекс самостоятельно. Т.е. рядом с текстовым файлом появится еще один файл, в котором будет сохранен двухсвяхный список.

Если нужен совсем хардкор, то различные алгоритмы сортировки гуглятся на раз. Если в исходном файле данные одинковой длины, то жизнь несколько упрощается.


2й и 3й способы будут гарантированно медленнее и геморройнее в реализации. Зато 100% свое :D


Выбирай любое подходящее тебе решение :)

#30 
Muenchausen завсегдатай12.04.23 10:21
Muenchausen
NEW 12.04.23 10:21 
in Antwort Программист 12.04.23 09:02

А почему играет роль одинаковая длина ? По идее я могу в текстовом исходном файле сделать автозамену 1 на 01 , 2 на 02 .. и тогда все однозначные станут двузначными и длига кода станет везде одинаковой. Я читал что при сортировке оно берет например первую строку и сравнивает со всеми следующими снизу, тоесть 870 млн сравниваний. Итого имеем прогрессию как бы ( 1+870млн)/2 × 870 млн что грубо равно 900 млн х 400 млн = 36000000 млн млн или 36 млн млн млн операций , это же куча времени !

Я никогда не боялся быть смешным , это не каждый может себе позволить ...
#31 
Программист коренной житель12.04.23 11:32
NEW 12.04.23 11:32 
in Antwort Muenchausen 12.04.23 10:21
А почему играет роль одинаковая длина ?

Потому что

1) в строках одинаковой длины легче навигация

2) строки одинаковой длины проще менять местами

Пример:

AAAA

DDDD

CCCC

BBBB


против

AA

DDD

BBBB

C


Очевидно, что в 1-ом случае для того, чтобы узнать начало какой-либо строки надо знать просто номер этой строки. Во втором случае для того, чтобы узнать начало 3-й строки нужно прочитать первые две (ну или построить индексный файл и хранить там начало и длину каждой строки).

С сортировкой все еще забавнее. Если для перестановки 2-й и 4-й строк понадобится всего 2 операции записи, то во стором случае понадобится 3 операции записи, при этом 3-я операция - это все, что между 2-й и 4-й строчкой. Т.е. если у тебя 1млн строк и ты хочешь поменять местами 2-ю и предпоследнюю строки, то ты перезапишешь практически весь файл. А чтение и запись - это очень медленные операции.


Я читал что при сортировке оно берет например первую строку и сравнивает со всеми следующими снизу, тоесть 870 млн сравниваний. Итого имеем прогрессию как бы ( 1+870млн)/2 × 870 млн что грубо равно 900 млн х 400 млн = 36000000 млн млн или 36 млн млн млн операций , это же куча времени !

Это не самый быстрый алгоритм :)

Есть более эффективные сортировки: https://www.toptal.com/developers/sorting-algorithms


#32 
Murr патриот12.04.23 12:40
Murr
NEW 12.04.23 12:40 
in Antwort Программист 12.04.23 08:22

Какой?

-----

#15 - смотри условия применимости.


Отсортированная одноколоночная табличка - это фактически и есть индекс.

-----

Индекс одноколоночной таблички - 100% дублирование оной. спок

#33 
alex445 коренной житель12.04.23 12:42
NEW 12.04.23 12:42 
in Antwort Muenchausen 12.04.23 07:38
Тоесть имеем текстовый файл например 90 гиг, где база из двух столбцов, в первом 30 значный код , во втором дата , и таких строчек по моему 870 млн штук, сколько времени нужно чтобы просто отсортировать по тридцатизначному коду в порядке возрастания ?

Зачем текстовый файл на 90 гиг? Зачем 30-значный код для миллиарда (10 знаков) записей? Зачем сортировать без смысла, без запроса? Разве что предварительная сортировка, но она делается один раз.

#34 
Muenchausen завсегдатай12.04.23 13:00
Muenchausen
NEW 12.04.23 13:00 
in Antwort alex445 12.04.23 12:42

ну как бы анализ событий случившихся за многие годы, а результат кодирован тридцатизнаком, причем там тысячи за день, просто скидывалось в текстовик годами, но формат соблюден. Задача найти топ 10 например повторяющихся, но мне хватит даже если все их просто отсортировать по возрастанию а там я уже макросом пройдусь по текстовику. А текстовик потому что я ексцелем иногда балуюсь, с текста легче вынимать и там нет ограничения на 90 гб файлразмер.

Я никогда не боялся быть смешным , это не каждый может себе позволить ...
#35 
Murr патриот12.04.23 13:05
Murr
NEW 12.04.23 13:05 
in Antwort Программист 12.04.23 09:02

Отсортированные данные готовы.

-----

Ээээ... каким образом?


гуглятся на раз

-----

Ээээ... а зачем? для файлового варианта все есть в системе...


но это будет не то, чтобы очень долго

------

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

#36 
Murr патриот12.04.23 13:14
Murr
NEW 12.04.23 13:14 
in Antwort Muenchausen 12.04.23 10:21

А почему играет роль одинаковая длина ?

-----

Ты хоть немножко программируешь?

Напиши простую программку - прочитать эн-ную строку из файла.

Один вариант - для равнодлинных строк, другой - для переменной длинны.

И погоняй на своих 870 млн строк.

Все поймешь...

#37 
Muenchausen завсегдатай12.04.23 13:18
Muenchausen
NEW 12.04.23 13:18 
in Antwort Murr 12.04.23 13:14

ну я составляю Produktionsprogramm на месяц )) а так в вижуалбейсике в ексцеле балуюсь.

Я никогда не боялся быть смешным , это не каждый может себе позволить ...
#38 
Murr патриот12.04.23 13:36
Murr
NEW 12.04.23 13:36 
in Antwort Muenchausen 12.04.23 13:00

мне хватит

-----

Потому что у тебя есть полдня, а то и неделя, чтобы найти этот десяток...

А мне - не хватит - потому что у меня от сотни до десятка тысяч запросов в минуту и каждый ожидает ответа не более полсекунды.

#39 
Murr патриот12.04.23 13:40
Murr
NEW 12.04.23 13:40 
in Antwort Muenchausen 12.04.23 13:18

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

#40 
1 2 3 alle