|
|
|
Delphi+SQLite+FireDac: 50 тыс. последовательных запросов SELECT сжирает память
|
|||
|---|---|---|---|
|
#18+
Всем привет. Помогите решить проблему: Читаю из текстового файла строку, разбираю на составляющие и делаю разные проверки. При этом выполняется от 4 до 6 простых запросов "SELECT" (максимум данные из двух таблиц). После подготовленные данные вставляю в таблицу INSERT или UPDATE Сама проблема заключается в том, что при чтении файла с 18500 строками, память приложения вырастает из 17 Мб до 1470 Мб. Выяснил, что запрос insert или update не влияет на память (вынес этот запрос в конец процедуры, когда доходила до него очередь, память уже занимала 1,4 Гб) При чем после закрытия приложения, память сначала уменьшается в течении секунд 20, и потом приложение закрывается. Подскажите, куда посмотреть . Заранее спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2017, 20:47:39 |
|
||
|
Delphi+SQLite+FireDac: 50 тыс. последовательных запросов SELECT сжирает память
|
|||
|---|---|---|---|
|
#18+
Free добавить надо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2017, 20:54:26 |
|
||
|
Delphi+SQLite+FireDac: 50 тыс. последовательных запросов SELECT сжирает память
|
|||
|---|---|---|---|
|
#18+
Kikoma...Подскажите, куда посмотреть . Заранее спасибо. В код. Пожалусто. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2017, 20:55:43 |
|
||
|
Delphi+SQLite+FireDac: 50 тыс. последовательных запросов SELECT сжирает память
|
|||
|---|---|---|---|
|
#18+
KikomaВыяснил, что запрос insert или update не влияет на память (вынес этот запрос в конец процедуры, когда доходила до него очередь, память уже занимала 1,4 Гб)Ну дык локализуйте (или код показывайте). Вероятно и "SQLite+FireDac" тоже не при чём, а дело в том, как Вы файл читаете, строки храните, запросы формируете и т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2017, 20:59:10 |
|
||
|
Delphi+SQLite+FireDac: 50 тыс. последовательных запросов SELECT сжирает память
|
|||
|---|---|---|---|
|
#18+
Код: pascal 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. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. 220. 221. 222. 223. 224. 225. 226. 227. 228. 229. 230. 231. 232. 233. 234. 235. 236. 237. 238. 239. 240. 241. 242. 243. 244. 245. 246. 247. 248. 249. 250. 251. 252. 253. Проверка данных, т.е. запросы к БД, проходит вся на двух FDQuery1 и FDQUery2 Запись происходит FDQuery4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2017, 21:23:49 |
|
||
|
Delphi+SQLite+FireDac: 50 тыс. последовательных запросов SELECT сжирает память
|
|||
|---|---|---|---|
|
#18+
GetOption -- можно вынести за пределы всего цикла. Если проблема с памятью решится -- значит см код внутри. Так же некорректно сделано с query4 -- надо убрать в двух местах SQL.Add(s); и добавить туда присвоение через Text. Вроде больше ничего подозрительного нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2017, 21:32:40 |
|
||
|
Delphi+SQLite+FireDac: 50 тыс. последовательных запросов SELECT сжирает память
|
|||
|---|---|---|---|
|
#18+
Еще надо добавить ReportMemoryLeaksOnShutdown := True куда-нибудь при запуске приложения, чтобы в конце при завершении появился отчет об утечках памяти, если они были (те объекты, что надо освободить вручную в коде через free). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2017, 21:35:47 |
|
||
|
Delphi+SQLite+FireDac: 50 тыс. последовательных запросов SELECT сжирает память
|
|||
|---|---|---|---|
|
#18+
"Ихтиандр, сын мой, я тебе еды принес..." - (с). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2017, 21:36:49 |
|
||
|
Delphi+SQLite+FireDac: 50 тыс. последовательных запросов SELECT сжирает память
|
|||
|---|---|---|---|
|
#18+
Сильно можно и не разбираться в коде. основной алгоритм такой Код: pascal 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2017, 21:38:56 |
|
||
|
Delphi+SQLite+FireDac: 50 тыс. последовательных запросов SELECT сжирает память
|
|||
|---|---|---|---|
|
#18+
Если нет утечек, то проблема может быть в том, что у тебя вычитана куча данных из базы в какой-то из наборов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2017, 21:51:50 |
|
||
|
Delphi+SQLite+FireDac: 50 тыс. последовательных запросов SELECT сжирает память
|
|||
|---|---|---|---|
|
#18+
Еще может быть включена ЭврикаЛог с поиском утечек или другой аналогичный сервис (но когда он есть, то помощь форума уже не нужна). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2017, 21:55:30 |
|
||
|
Delphi+SQLite+FireDac: 50 тыс. последовательных запросов SELECT сжирает память
|
|||
|---|---|---|---|
|
#18+
JaDiGetOption -- можно вынести за пределы всего цикла. Если проблема с памятью решится -- значит см код внутри. Так же некорректно сделано с query4 -- надо убрать в двух местах SQL.Add(s); и добавить туда присвоение через Text. Вроде больше ничего подозрительного нет. Проблема была с GetOption. Задал явно и все встало нормально. А внутри процедуры динамически создавал TFDQuery, а Free не делал. Спасибо большое JaDi! Кстати, JaDiТак же некорректно сделано с query4 -- надо убрать в двух местах SQL.Add(s); и добавить туда присвоение через Text. Это как? можно подробнее... с Text не работал ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2017, 21:57:19 |
|
||
|
Delphi+SQLite+FireDac: 50 тыс. последовательных запросов SELECT сжирает память
|
|||
|---|---|---|---|
|
#18+
makhaonЕсли нет утечек, то проблема может быть в том, что у тебя вычитана куча данных из базы в какой-то из наборов. Какие блобы. Человек целиком считывает текстовый файл, формирует из строчек запросы либо insert, либо update, ВСЁ СРАЗУ запихивает в FDQuery4.SQL, и, если FDQuery4.SQL не взорвался от количества, просит сервер исполнить весь пакет говна: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 20941493 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2017, 22:01:07 |
|
||
|
Delphi+SQLite+FireDac: 50 тыс. последовательных запросов SELECT сжирает память
|
|||
|---|---|---|---|
|
#18+
чччД и, если FDQuery4.SQL не взорвался от количества 20941493 )) Точно подмечено )))))) Вообще запись сразу делалась, это я его отдельно вынес, дабы вычислить от чего память растет, от чтения или записи. Оказалось, от кривых ручек )))))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2017, 22:07:56 |
|
||
|
Delphi+SQLite+FireDac: 50 тыс. последовательных запросов SELECT сжирает память
|
|||
|---|---|---|---|
|
#18+
KikomaЭто как? можно подробнее... с Text не работал Я к тому, что там формируется огромнейший список запросов, который потом отправляется на сервер. Видимо, у фаердак слишком умный парсер, который этот запрос разбирает на отдельные части и отсылает их поочередно. Это неправильно. Нужен один запрос? Можно тогда уж делать через конструкцию вида SELECT INTO table(x,y) SELECT x,y... Но вообще, я бы отправлял их по отдельности (один запрос, один вызов) с информированием о прогрессе. И только потом уже, когда будет затык именно в этом месте -- решать вопрос, каким именно образом формировать пачки и отправлять на сервер, чтобы все быстрее было. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2017, 23:08:57 |
|
||
|
Delphi+SQLite+FireDac: 50 тыс. последовательных запросов SELECT сжирает память
|
|||
|---|---|---|---|
|
#18+
JaDiЯ к тому, что там формируется огромнейший список запросов, который потом отправляется на сервер. Давно у SQLite отрос сервер?.. Но за код, где запросы закрываются перед использованием, надо отрывать руки, конечно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2017, 01:17:22 |
|
||
|
Delphi+SQLite+FireDac: 50 тыс. последовательных запросов SELECT сжирает память
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovНо за код, где запросы закрываются перед использованием, надо отрывать руки, конечно. Что не так то? Научи уму разуму, всегда готов выслушать дельный совет А то что огромный запрос формируется, то это было сделано для выявления проблемы, сейчас все вернулось назад. Хотя с другой стороны, я в этом запросе большом не вижу проблем. Получился большой SQL script который успешно выполняется. Единственный минус: прогресс не виден. В остальном проблем не вижу. Ну и в любом случае, повторюсь, уже не актуально, т.к. вернулся на одна строка - один запрос. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2017, 07:08:49 |
|
||
|
Delphi+SQLite+FireDac: 50 тыс. последовательных запросов SELECT сжирает память
|
|||
|---|---|---|---|
|
#18+
KikomaЧто не так то? Время существования ресурса не контролируется. Поэтому у тебя и сюрпризы в виде неизвестно куда израсходованной памяти. Правильный паттерн выглядит так: выделил ресурс - использовал - освободил сразу как только тот стал не нужен. У тебя же наоборот: выделил ресурс - использовал - забыл про него до следующего раза. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2017, 13:32:51 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39550583&tid=2041614]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
162ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
| others: | 218ms |
| total: | 475ms |

| 0 / 0 |
