|
|
|
FDQuery.SaveToStream(fMemoryStream,sfBinary) - память
|
|||
|---|---|---|---|
|
#18+
Здравствуйте, помогите пожалуйста разобраться с выделением памяти. Мне нужно передать содержимое Query по сети через HTTP, я решил выгрузить результат в память FDQuery.SaveToStream(fMemoryStream,sfBinary) и затем передать по сети, все работает, но вот в оперативке увеличивается занимаемая память: Код: 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. А вот что происходит в оперативке: кб: запуск: 2 740 FDConnection1.Connected := true;(MSAccess): 4 768 Query.Open: 5 648 SaveToStream(fMemoryStream,sfBinary): 43 744 Query.Close: 23 712 FreeAndNil(fMemoryStream): 15 892 FDConnection1.Connected := False: 15 764 Почему до SaveToStream память не увеличивалась вообще, а после сразу двукратно за query и fMemoryStream и после освобождения не вернулась к изначальному состоянию? Модератор: Как мне оформить свое сообщение? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2017, 09:55:17 |
|
||
|
FDQuery.SaveToStream(fMemoryStream,sfBinary) - память
|
|||
|---|---|---|---|
|
#18+
Sandist, Код не смотрел, возможно есть нюансы. Несколько коментов. авторПочему до SaveToStream память не увеличивалась вообще попробуй сделать FetchAll, посмотришь. авторпосле освобождения не вернулась к изначальному состоянию? считай, что освободилась. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2017, 10:36:34 |
|
||
|
FDQuery.SaveToStream(fMemoryStream,sfBinary) - память
|
|||
|---|---|---|---|
|
#18+
makhaon, в диспетчере задач видно, что память занята, почему так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2017, 15:03:18 |
|
||
|
FDQuery.SaveToStream(fMemoryStream,sfBinary) - память
|
|||
|---|---|---|---|
|
#18+
Ну, во-первых, замени своё Sandist Код: 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. на Код: 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. и думай, почему так, до просветления. А затем уже более сложными вопросами задавайся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2017, 15:29:30 |
|
||
|
FDQuery.SaveToStream(fMemoryStream,sfBinary) - память
|
|||
|---|---|---|---|
|
#18+
Sandist, и, да (на заметил сразу), делать локальные переменные равными nil в конце функции - бесполезная операция, достаточно вызова деструктора, или хотя бы .Free (для общей схемы), но это ладно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2017, 15:31:46 |
|
||
|
FDQuery.SaveToStream(fMemoryStream,sfBinary) - память
|
|||
|---|---|---|---|
|
#18+
За except end; надо безжалостно отрывать руки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2017, 16:31:45 |
|
||
|
FDQuery.SaveToStream(fMemoryStream,sfBinary) - память
|
|||
|---|---|---|---|
|
#18+
YuRock, спасибо за совет, но память так же не освобождается ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2017, 16:34:49 |
|
||
|
FDQuery.SaveToStream(fMemoryStream,sfBinary) - память
|
|||
|---|---|---|---|
|
#18+
или можете подсказать, как можно скопировать данные из quey в MemoryStream порциями? чтобы после передачи можно было так же подгрузить его в Query и осуществлять манипуляции ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2017, 16:40:19 |
|
||
|
FDQuery.SaveToStream(fMemoryStream,sfBinary) - память
|
|||
|---|---|---|---|
|
#18+
ДВК-2 ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2017, 17:03:50 |
|
||
|
FDQuery.SaveToStream(fMemoryStream,sfBinary) - память
|
|||
|---|---|---|---|
|
#18+
Sandistспасибо за совет, но память так же не освобождается Если в диспетчере задач цифры не меняются - это не значит, что она не освобождается. Выполни свою процедуру 1000000 раз и убедишься в этом (лубо в том, что она действительно не освобождается). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2017, 18:28:50 |
|
||
|
FDQuery.SaveToStream(fMemoryStream,sfBinary) - память
|
|||
|---|---|---|---|
|
#18+
Sandist, и еще. Если бы ты не использовал with в этой ф-ции - тебе было бы проще разобраться в своем коде. Не говоря уже об окружающих. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2017, 18:34:10 |
|
||
|
FDQuery.SaveToStream(fMemoryStream,sfBinary) - память
|
|||
|---|---|---|---|
|
#18+
schiЗа except end; надо безжалостно отрывать руки. Я кстати дальше код не смотрел. Потом посмотрел... ТС, ты должен освобождать объекты, если они были созданы. А не по условию Код: pascal 1. Либо в начале создай объект, либо проинициализируй переменную nil вначале же (естественно, перед блоком try-finally). А затем можешь смело делать ей безусловное Free в блоке finally-end. Блоки try-except используй не для того, чтобы подавить ошибку - это не поможет, а чтобы увидеть её в логе и в итоге исправить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2017, 18:42:14 |
|
||
|
FDQuery.SaveToStream(fMemoryStream,sfBinary) - память
|
|||
|---|---|---|---|
|
#18+
Sandist, А вот что происходит в оперативке: ... в диспетчере задач видно, что память занятазаменить на Код: pascal 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2017, 18:49:30 |
|
||
|
FDQuery.SaveToStream(fMemoryStream,sfBinary) - память
|
|||
|---|---|---|---|
|
#18+
сколько бы раз я не вызывал процедуру память не увеличивается, останавливается на 15мб, ReportMemoryLeaksOnShutdown - утечки не показывает Можно сделать вывод, что диспетчер показывается неверные данные? если в Finally написать так: Код: pascal 1. 2. это будет правильно? Спасибо большое за помощь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2017, 11:29:06 |
|
||
|
FDQuery.SaveToStream(fMemoryStream,sfBinary) - память
|
|||
|---|---|---|---|
|
#18+
Sandist, используйте утилиту rammap для просмотра кусков памяти, занятых приложением. SandistМожно сделать вывод, что диспетчер показывается неверные данные? он просто не все показывает. Например, вам кажется что из 16 гиг 8 свободно, а на самом деле они используются виндой под кэш, и т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2017, 11:53:41 |
|
||
|
FDQuery.SaveToStream(fMemoryStream,sfBinary) - память
|
|||
|---|---|---|---|
|
#18+
SandistМожно сделать вывод, что диспетчер показывается неверные данные? Он показывает верные данные. Но утечек при этом нет. Sandistесли в Finally написать так: Код: pascal 1. 2. это будет правильно? Если ты наведешь мышку на Free, нажмешь Ctrl и нажмешь левую кнопку мыши - ты зайдешь в исходник TObject.Free и больше вопросов возникнуть не должно, как и дебильных проверок if Assigned then Free. Ну а если в fMemoryStream неинициализированный мусор, а не nil - то никакие проверки не помогут. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2017, 12:55:15 |
|
||
|
FDQuery.SaveToStream(fMemoryStream,sfBinary) - память
|
|||
|---|---|---|---|
|
#18+
Sandistесли в Finally написать так: Код: pascal 1. 2. это будет правильно? Это будет неправильно, проверка на Assigned уже есть внутри .Free, правильно будет просто вызвать Код: pascal 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2017, 12:55:32 |
|
||
|
|

start [/forum/topic.php?fid=58&fpage=134&tid=2041915]: |
0ms |
get settings: |
9ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
67ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
| others: | 212ms |
| total: | 368ms |

| 0 / 0 |
