|
Пересчет построчно таблицы.
|
|||
---|---|---|---|
#18+
Всем привет! Вопрос такой. Есть табличка. Столбцов - 70, строк -1500. Требуется значения столбцов второй строки пересчитать как сумму имеющегося значения + значение столбца первой строки. Соответственно, для третьей строки - сумма значений уже новой второй + значение третьей. Алгоритм элементарный, но... На табличку уходит 0.5 сек., а табличек .... - 60.000. Итого - 8 часов. Может, есть что-то поумнее простого перебора строк? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2014, 10:22 |
|
Пересчет построчно таблицы.
|
|||
---|---|---|---|
#18+
Если алгоритм это скан таблицы в один проход, то улучшать его бесполезно. Можно добавить для ускорения следующее: 1. Открытие файлов монопольно (быстрее чтение запись) 2. Надеюсь файлы локально лежат (не по сети качаются) 3. Распараллелить обработку, т.е. запустить несколько копий обработчиков и каждому дать свою группу файлов. Сколько копий оптимально не скажу, как минимум сколько ядер у процессора, точнее можно опытным путем затестить. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2014, 10:37 |
|
Пересчет построчно таблицы.
|
|||
---|---|---|---|
#18+
Dima T, 0. Не сканом... Считывается в массив первая строка, вторая. Второй присваивается значение суммы двух, запоминается в массив. считывается третья - складывается с массивом второй и запоминается.. И тд. 1. монопольно 2. локально 3. подумаю, но, кажется проблема в п.0 ... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2014, 10:54 |
|
Пересчет построчно таблицы.
|
|||
---|---|---|---|
#18+
Stind0. Не сканом... Считывается в массив первая строка, вторая. Второй присваивается значение суммы двух, запоминается в массив. считывается третья - складывается с массивом второй и запоминается.. И тд. ... 3. подумаю, но, кажется проблема в п.0 Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2014, 11:27 |
|
Пересчет построчно таблицы.
|
|||
---|---|---|---|
#18+
PaulWist, Не совсем такая задача... Требуется складывать значения строк по столбцам. имеем 1 1 1 2 3 4 3 2 1 Должно получится 1 1 1 3 4 5 6 6 6 ... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2014, 12:26 |
|
Пересчет построчно таблицы.
|
|||
---|---|---|---|
#18+
StindPaulWist, Не совсем такая задача... Требуется складывать значения строк по столбцам. имеем 1 1 1 2 3 4 3 2 1 Должно получится 1 1 1 3 4 5 6 6 6 1. По какому признаку определяется, где первая "строка", где вторая? 2. Надо получить в конце концов - нарастающий итог? 3. Первичный ключ у табличек есть? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2014, 13:08 |
|
Пересчет построчно таблицы.
|
|||
---|---|---|---|
#18+
На держи, только в таблички нужно добавить нарастающий первичный ключ определяющий порядок "строк" (если его нет). Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2014, 13:12 |
|
Пересчет построчно таблицы.
|
|||
---|---|---|---|
#18+
Так будет правильней Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2014, 13:14 |
|
Пересчет построчно таблицы.
|
|||
---|---|---|---|
#18+
А так ещё лучше (думаю идея понятна): Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2014, 13:16 |
|
Пересчет построчно таблицы.
|
|||
---|---|---|---|
#18+
PaulWistStindPaulWist, Не совсем такая задача... Требуется складывать значения строк по столбцам. имеем 1 1 1 2 3 4 3 2 1 Должно получится 1 1 1 3 4 5 6 6 6 1. По какому признаку определяется, где первая "строка", где вторая? 2. Надо получить в конце концов - нарастающий итог? 3. Первичный ключ у табличек есть? 1. Первая строка - это первая строка (без индексов).... последняя - последняя. 2. Требуется для каждой строки (со второй) иметь текущий нарастающий итог. 3. Ключей нет. Спасибо, покопаюсь... ... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2014, 13:54 |
|
Пересчет построчно таблицы.
|
|||
---|---|---|---|
#18+
Stind1. Первая строка - это первая строка (без индексов).... последняя - последняя. 2. Требуется для каждой строки (со второй) иметь текущий нарастающий итог. 3. Ключей нет. Спасибо, покопаюсь... 1. То есть, если последнюю строку сделать первой, то совершенно не важно, что "нарастающий итог" в со второй по предпоследнюю строчку поменяется, ... мдя. 2. Порядка (order) в таблице не существует, первая и последняя строка задаются какими-то критериями сортировки, правда есть физический порядок записей, но это не значит, что такой порядок является отсортированным. 3. Опа, а как ты отличаешь одну запись от другой? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2014, 14:38 |
|
Пересчет построчно таблицы.
|
|||
---|---|---|---|
#18+
Stindпропущено... 1. Первая строка - это первая строка (без индексов).... последняя - последняя. 2. Требуется для каждой строки (со второй) иметь текущий нарастающий итог. 3. Ключей нет. Так только для ограниченного круга задач (когда таблицы полностью помещаются в памяти и только дописываются) можно делать. Иначе - проблем не оберешься. Например: некто пометил на удаление строку в таблице и физически третья строка логически стала второй. Это что же, все нижеследующие строки пересчитывать? А если их не одна, а миллион? Проверьте алгоритм, скорее всего ошибка именно в нем... и Вашу задачу можно решить намного проще... ... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2014, 14:44 |
|
Пересчет построчно таблицы.
|
|||
---|---|---|---|
#18+
PaulWistStind1. Первая строка - это первая строка (без индексов).... последняя - последняя. 2. Требуется для каждой строки (со второй) иметь текущий нарастающий итог. 3. Ключей нет. Спасибо, покопаюсь... 1. То есть, если последнюю строку сделать первой, то совершенно не важно, что "нарастающий итог" в со второй по предпоследнюю строчку поменяется, ... мдя. 2. Порядка (order) в таблице не существует, первая и последняя строка задаются какими-то критериями сортировки, правда есть физический порядок записей, но это не значит, что такой порядок является отсортированным. 3. Опа, а как ты отличаешь одну запись от другой? Я так думаю, что таблички каждый раз формируются заново какой-то процедурой, являющейся для ТС "черным ящиком"... И единственный ключ, что ему доступен - порядок записей... ... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2014, 14:50 |
|
Пересчет построчно таблицы.
|
|||
---|---|---|---|
#18+
StindТребуется складывать значения строк по столбцам. имеем 1 1 1 2 3 4 3 2 1 Должно получится 1 1 1 3 4 5 6 6 6 Так подойдет? Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2014, 14:50 |
|
Пересчет построчно таблицы.
|
|||
---|---|---|---|
#18+
По-хорошему надо создавать новую таблицу с результатом и писать в нее, т.к. писать в исходную таблицу не самая хорошая идея, например что-то сглючит и останется таблица наполовину пересчитанная, или наоборот случайно дважды обработаешь. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2014, 14:54 |
|
Пересчет построчно таблицы.
|
|||
---|---|---|---|
#18+
PaulWist 1. То есть, если последнюю строку сделать первой, то совершенно не важно, что "нарастающий итог" в со второй по предпоследнюю строчку поменяется, ... мдя. 2. Порядка (order) в таблице не существует, первая и последняя строка задаются какими-то критериями сортировки, правда есть физический порядок записей, но это не значит, что такой порядок является отсортированным. 3. Опа, а как ты отличаешь одну запись от другой? 1. А зачем менять? Таблички стабильны, собственно, первая строка - данные за сегодня, вторая - за вчера, третья - позавчера. Т.о. "обратный" нарастающий итог. 2. Соответственно, порядок всегда один. 3. По номеру записи. Кстати, в первом столбце прописывается дата, но, естественно, в итогах не расчитывается ... |
|||
:
Нравится:
Не нравится:
|
|||
29.08.2014, 08:05 |
|
Пересчет построчно таблицы.
|
|||
---|---|---|---|
#18+
Станислав С...кийЯ так думаю, что таблички каждый раз формируются заново какой-то процедурой, являющейся для ТС "черным ящиком"... И единственный ключ, что ему доступен - порядок записей... Нет, таблички я сам формирую. Ключа нет, просто иду по записям сверху вниз. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.08.2014, 08:07 |
|
Пересчет построчно таблицы.
|
|||
---|---|---|---|
#18+
Станислав С...кийТак только для ограниченного круга задач (когда таблицы полностью помещаются в памяти и только дописываются) можно делать. Иначе - проблем не оберешься. Например: некто пометил на удаление строку в таблице и физически третья строка логически стала второй. Это что же, все нижеследующие строки пересчитывать? А если их не одна, а миллион? Проверьте алгоритм, скорее всего ошибка именно в нем... и Вашу задачу можно решить намного проще... Никто с этими табличками не работает. Данные в них никак не меняются (кроме обратного счета). И, кстати, неплохая мысль - м.б. грузить таблицу в 2-мерный массив и работать в памяти, а потом выгружать в файл? Много времени ведь тратится на чтение-запись диска... Есть функция загрузки таблицы в массив и обратно? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.08.2014, 08:12 |
|
Пересчет построчно таблицы.
|
|||
---|---|---|---|
#18+
Dima TПо-хорошему надо создавать новую таблицу с результатом и писать в нее, т.к. писать в исходную таблицу не самая хорошая идея, например что-то сглючит и останется таблица наполовину пересчитанная, или наоборот случайно дважды обработаешь. Согласен, но эта запись-перезапись опять съест время, а сбоить вроде негде... ... |
|||
:
Нравится:
Не нравится:
|
|||
29.08.2014, 08:14 |
|
Пересчет построчно таблицы.
|
|||
---|---|---|---|
#18+
Dima T, Ок, спасибо за текст. Попробую... ... |
|||
:
Нравится:
Не нравится:
|
|||
29.08.2014, 08:14 |
|
Пересчет построчно таблицы.
|
|||
---|---|---|---|
#18+
Dima T, Вдогонку. В принципе, у меня сделано аналогично... Проблема в том, что имена столбцов, их количество и их порядок каждый день могут измениться (выгрузка работает ночью раз в сутки). Поэтому впрямую такой алгоритм даже не знаю, как и применить... ... |
|||
:
Нравится:
Не нравится:
|
|||
29.08.2014, 08:24 |
|
Пересчет построчно таблицы.
|
|||
---|---|---|---|
#18+
Во блин, и реинкарнация... Ник-то туевую тучу лет как спал! ... |
|||
:
Нравится:
Не нравится:
|
|||
29.08.2014, 09:16 |
|
Пересчет построчно таблицы.
|
|||
---|---|---|---|
#18+
sqlnewИ, кстати, неплохая мысль - м.б. грузить таблицу в 2-мерный массив и работать в памяти, а потом выгружать в файл? Много времени ведь тратится на чтение-запись диска... В массив целиком твоя таблица просто не влезет, т.к. возможно максимум 65000 переменных, т.е. массив не более 65000 элементов. По умолчанию ~16000. sqlnewПроблема в том, что имена столбцов, их количество и их порядок каждый день могут измениться Так все-таки "могут" или "меняются" ? Если "могут измениться" это просто попытка решить задачу раз и навсегда с учетом будущих изменений стуктуры, то лучше на эту тему не заморачиваться, т.к. при твоем объеме важна скорость, а любая попытка написать что-то универсальное только создаст лишние тормоза. Проще добавить проверку структуры при открытии и в случае несовпадения писать в лог или еще как-то сигнализировать. Если используешь макроподстановки или EVAL() - это тормоза. Попробуй SCATTER/GATHER Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31.
sqlnewпервая строка - данные за сегодня, вторая - за вчера, третья - позавчера. Т.о. "обратный" нарастающий итог. ... Нет, таблички я сам формирую. Я так подозреваю что перед этим ночным расчетом генерация этих табличек происходит. Может есть смыл совместить? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.08.2014, 09:55 |
|
Пересчет построчно таблицы.
|
|||
---|---|---|---|
#18+
Dima T1. В массив целиком твоя таблица просто не влезет, т.к. возможно максимум 65000 переменных, т.е. массив не более 65000 элементов. По умолчанию ~16000. 2. Так все-таки "могут" или "меняются" ? Если "могут измениться" это просто попытка решить задачу раз и навсегда с учетом будущих изменений стуктуры, то лучше на эту тему не заморачиваться, т.к. при твоем объеме важна скорость, а любая попытка написать что-то универсальное только создаст лишние тормоза. Проще добавить проверку структуры при открытии и в случае несовпадения писать в лог или еще как-то сигнализировать. 3. Если используешь макроподстановки или EVAL() - это тормоза. 4. [spoiler Попробуй SCATTER/GATHER] 5. Я так подозреваю что перед этим ночным расчетом генерация этих табличек происходит. Может есть смыл совместить? 1. declare xx_p[1500*100] xx_p=0 xx_p[1500*100]=1 ? xx_p[1500*100] 1! Или где-то засада? 2. Ну, может. Реально столбцы могут меняться редко. 3. Макры есть ;-( 4. Попробую... Спасибо. 5. Пробовал, тогда тормоза добавляются к тому расчету... ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2014, 16:34 |
|
Пересчет построчно таблицы.
|
|||
---|---|---|---|
#18+
sqlnew1. declare xx_p[1500*100] xx_p=0 xx_p[1500*100]=1 ? xx_p[1500*100] 1! Или где-то засада? Действительно работает, похоже попатчили в 9ке эту проблему, в 6-ке у меня были проблемы с adir() на папках с несколькими десятками тысяч файлов. Выпадывало по ошибке "Too many variables" sqlnew3. Макры есть ;-( Избавляйся sqlnew5. Пробовал, тогда тормоза добавляются к тому расчету... Я бы их параллельно запускал: 1. Первый процесс генерит в папку А 2. Второй процесс берет по одному файлу с папки А, обсчитывает, перемещает (не копирует) в папку Б. Второй мониторит папку постоянно, если за минуту ни одного файла не появилось - останавливается. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.09.2014, 17:35 |
|
|
start [/forum/topic.php?fid=41&fpage=30&tid=1582570]: |
0ms |
get settings: |
7ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
34ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
others: | 12ms |
total: | 143ms |
0 / 0 |