|
|
|
[PERL] Улучшить алгоритм синхронизации
|
|||
|---|---|---|---|
|
#18+
Вопрос в данном разделе, т.к. скрипт для синхронизации написан на Perl и будут использоваться его возможности. Доступа к БД у меня нет, для работы с БД предоставляется API, реализующий SQL-подобные команды. Возможности создания временных таблиц тоже нет, т.е. добавлять новые записи в БД нужно построчно. Поэтому я вначале считываю локально все данные из таблиц БД, сравниваю эти данные с теми, которые нужно внести в БД, и по результатам сравнения формирую пакеты команд для INSERT, UPDATE и DELETE запросов. К примеру у меня есть хеш с данными из БД: Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. Есть аналогичный по структуре хеш $local с новыми данными, которые должны оказаться в БД. Я предполагаю делать следующее: 1. Цикл foreach my $row (@{$remote->{rows}}). 1.1. Если !exists($local->{index}->{$row->{id}}), то $row->{id} добавить в список ID, подлежащих удалению. 1.2. Если запись существует, то сравнить остальные поля. Если хоть одно отличается, то добавить в список ID, подлежащих обновлению. 2. Цикл foreach my $row (@{$local->{rows}}). 2.1. Если !exists($remote->{index}->{$row->{id}}), то $row->{id} добавить в список новых записей. В качестве оптимизаций я рассматриваю следующие варианты. A. Сравнивать количество строк в $remote и $local. Где больше строк, использовать в первом цикле, где меньше строк, использовать во втором цикле. B. Перед первым циклом сделать %id = map {$_=>1} keys($local->{index}). В первом цикле выполнять delete $id{$row->{id}}. То что осталось в %id подлежит добавлению в БД. Есть ли смысл в подобных оптимизациях? Модератор: Есть смысл самостоятельно указывать язык программирования в названии темы обсуждения. ________________________ Мы смотрим с оптимизмом... ...в оптический прицел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2012, 10:31:17 |
|
||
|
[PERL] Улучшить алгоритм синхронизации
|
|||
|---|---|---|---|
|
#18+
Alibek B., а индексы в $remote и $local ты сам строишь или они из сервиса уже приезжают? если сам, можно попробовать сэкономить на их построении и последующей проверке exists, как-то так: Код: perl 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2012, 14:14:11 |
|
||
|
[PERL] Улучшить алгоритм синхронизации
|
|||
|---|---|---|---|
|
#18+
Строю сам. Примерно к такому я и пришел, разве что циклы по remote и local поменял местами (более удобно читать код, удобнее добавлять/обновлять записи в цикле по local, а удалять во втором цикле. Если кто-то работает с сервисом IPTVPortal, может быть пригодится такой код: Код: php 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. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. Вспомогательные структуры $meta и $iptv беруться из XML-файла (XML::Mini::Document->new()->parse(...)->toHash()->{'Data'}): Для $meta: Код: xml 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. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. Для $iptv: Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. В $cache загруженные данные из БД, структура примерно такая: $cache->{'tables'}->{$table} = {id=>$id,field1=>$field1,...} $cache->{'links'}->{$link_table}->{$foreign_table}->{foreign_column} = [@rows] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2012, 18:24:29 |
|
||
|
[PERL] Улучшить алгоритм синхронизации
|
|||
|---|---|---|---|
|
#18+
Оказывается зря старался. API-запросы на серверной стороне обрабатываются дополнительно и сохранение ссылочной целостности обеспечивается на стороне сервера. То есть рекурсивно удалять или проверять существование записи перед ее добавлением не надо, это сделает сам сервер. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2012, 18:38:41 |
|
||
|
|

start [/forum/topic.php?fid=23&msg=38009914&tid=1464526]: |
0ms |
get settings: |
6ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
154ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
31ms |
get tp. blocked users: |
1ms |
| others: | 204ms |
| total: | 418ms |

| 0 / 0 |
