Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
При работе с потоками СИЛЬНО растет используемая память
|
|||
|---|---|---|---|
|
#18+
Есть у меня файлы с данными по месяцам. Я решил перегруппировать их по клиентам, т.е. создать файлы, которые хранят данные за весь период для каждого отдельного клиента. Сначала я, обрабатывая каждый месяц исходных данных, открывал и закрывал файл клиента с добавлением нового в конец: Код: plaintext 1. Но это работало очень долго и я решил один раз открывать файл клиента, после каждого месяца делать flush(), а закрывать только когда по клиенту в течении месяца не было сделок. Для этого я создал такой объект: Код: plaintext 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. Теперь я могу написать такую функцию дозаписи в файлы: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Метод CloseOldFiles(cuint32 CurrentMonth) вызывается после обработки каждого месяца (таким образом закрываются файлы, что видно в отладчике). Но почему- то ОЧЕНЬ сильно растет потребление памяти. Ведь по логике я делаю flush(), и все данные должны сбрасываться на диск. В чем косяк? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2018, 10:30 |
|
||
|
При работе с потоками СИЛЬНО растет используемая память
|
|||
|---|---|---|---|
|
#18+
Заведи себе БД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2018, 10:44 |
|
||
|
При работе с потоками СИЛЬНО растет используемая память
|
|||
|---|---|---|---|
|
#18+
a guestЗаведи себе БД. Любая БД- это накладные расходы, которые замедлят работу (я работаю на домашнем компе и у меня нет отдельного сервера). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2018, 10:46 |
|
||
|
При работе с потоками СИЛЬНО растет используемая память
|
|||
|---|---|---|---|
|
#18+
AlekseySQLЛюбая БД- это накладные расходы, которые замедлят работу (я работаю на домашнем компе и у меня нет отдельного сервера). Прежде чем заявлять о замедлении работы, стоило бы провести бенчмаркинг и выяснить так ли это на самом деле, скажем, в случае файл-серверной БД (Access, SQLite, ...), и точно ли тебе нужна производительность в 1000000 операций записи-чтения в секунду. Ведь так можно и до FVMas'а дойти, а там всё плохо закончилось Используй SQLite как вариант, встроив в приложение как статик-либу. Можно сделать его полностью in-memory и потом дампить на диск когда нужно, не думаю, что данных у тебя столько, что не помещаются в современный объём RAM. Ну или запили свой LSM-tree ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2018, 11:23 |
|
||
|
При работе с потоками СИЛЬНО растет используемая память
|
|||
|---|---|---|---|
|
#18+
AlekseySQLНо почему- то ОЧЕНЬ сильно растет потребление памяти. При любых проблемах с памятью Вам поможет DrMemory. Очень рекомендую. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2018, 12:00 |
|
||
|
При работе с потоками СИЛЬНО растет используемая память
|
|||
|---|---|---|---|
|
#18+
AlekseySQLНо почему- то ОЧЕНЬ сильно растет потребление памяти. Ведь по логике я делаю flush(), и все данные должны сбрасываться на диск. В чем косяк? Файлы тут ни при чем. Данные пишутся в буфер размером 4-8 кб и по заполнению буфера сбрасываются на диск, т.е. flush() вообще никак не влияет на расход памяти, это просто команда принудительно записать из буфера на диск не дожидаясь заполнения. Дополнительный тормоз защищающий от потери данных в случае вылета проги. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2018, 14:08 |
|
||
|
При работе с потоками СИЛЬНО растет используемая память
|
|||
|---|---|---|---|
|
#18+
Dima TФайлы тут ни при чем. Данные пишутся в буфер размером 4-8 кб и по заполнению буфера сбрасываются на диск, т.е. flush() вообще никак не влияет на расход памяти, это просто команда принудительно записать из буфера на диск не дожидаясь заполнения. Дополнительный тормоз защищающий от потери данных в случае вылета проги. Не соглашусь: я в свое время записывал файлы на диск без вызова метода flush(), просто закрывая их (при этом делается принудительный flush()). Так вот закрытие файла было о-о-очень долгим делом, и в итоге я его перенес в отдельный асинхронный поток, чтобы повысить производительность. Не думаю, что эти тормоза были из- за записи 4 кб (а остальные 100-500 МБайт файла писались относительно быстро). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2018, 14:18 |
|
||
|
При работе с потоками СИЛЬНО растет используемая память
|
|||
|---|---|---|---|
|
#18+
AlekseySQLDima TФайлы тут ни при чем. Данные пишутся в буфер размером 4-8 кб и по заполнению буфера сбрасываются на диск, т.е. flush() вообще никак не влияет на расход памяти, это просто команда принудительно записать из буфера на диск не дожидаясь заполнения. Дополнительный тормоз защищающий от потери данных в случае вылета проги. Не соглашусь: я в свое время записывал файлы на диск без вызова метода flush(), просто закрывая их (при этом делается принудительный flush()). Так вот закрытие файла было о-о-очень долгим делом, и в итоге я его перенес в отдельный асинхронный поток, чтобы повысить производительность. Не думаю, что эти тормоза были из- за записи 4 кб (а остальные 100-500 МБайт файла писались относительно быстро). ОС кэширует запись на диск, она под это задействует свободную память, но не память процесса. Внутри процесса небольшой буфер, если не веришь - есть исходники, вот одна из реализаций . Ты повышенный расход памяти как определил: твой процесс много памяти забирает или в целом занято много? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2018, 14:34 |
|
||
|
При работе с потоками СИЛЬНО растет используемая память
|
|||
|---|---|---|---|
|
#18+
Dima TОС кэширует запись на диск, она под это задействует свободную память, но не память процесса. Внутри процесса небольшой буфер, если не веришь - есть исходники, вот одна из реализаций . Ты повышенный расход памяти как определил: твой процесс много памяти забирает или в целом занято много? Процесс потребляет 7 ГБ (при конвертации исходных файлов размером 5 ГБ). Но после завершения обработки память почему- то не высвобождается, так что я буду искать ошибку: какие- то объекты не вызывают своих деструкторов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2018, 14:46 |
|
||
|
При работе с потоками СИЛЬНО растет используемая память
|
|||
|---|---|---|---|
|
#18+
AlekseySQLя буду искать ошибку Слушать чужих советов и использовать DrMemory ты отказываешься по идеологическим или религиозным мотивам? Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2018, 16:35 |
|
||
|
При работе с потоками СИЛЬНО растет используемая память
|
|||
|---|---|---|---|
|
#18+
Всем спасибо, ошибка найдена! Оказалось все дело в том, что в структуру, которой я наполнял массив, было добавлено поле с типом std::string. Это примерно в три раза увеличило размер структуры и как следствие- в три раза увеличился объем потребляемой памяти. Поэтому часть памяти начала свопиться на диск и работа программы сильно замедлилась. Я завтра протестирую что быстрее: постоянное открытие / закрытие файлов с дозаписью или хранение открытых файлов в коллекции и использование flush(). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2018, 18:23 |
|
||
|
При работе с потоками СИЛЬНО растет используемая память
|
|||
|---|---|---|---|
|
#18+
AlekseySQLЯ завтра протестирую что быстрее: постоянное открытие / закрытие файлов с дозаписью или хранение открытых файлов в коллекции и использование flush(). Быстрее второе, а еще быстрее второе без flush() ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2018, 19:19 |
|
||
|
При работе с потоками СИЛЬНО растет используемая память
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovСлушать чужих советов и использовать DrMemory ты отказываешься по идеологическим или религиозным мотивам? Спасибо за советы. С помощью Vtune Amplifier я проанализировал выделение и освобождение памяти. Оказалось, что никаких утечек нет. Другими словами это не техническая, а логическая ошибка. Поэтому автоматические инструменты не помогут. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2018, 19:46 |
|
||
|
При работе с потоками СИЛЬНО растет используемая память
|
|||
|---|---|---|---|
|
#18+
Dima TБыстрее второе, а еще быстрее второе без flush() Если потоки действительно пишут по 4 кб, то тогда так и есть. Завтра проверю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2018, 19:48 |
|
||
|
При работе с потоками СИЛЬНО растет используемая память
|
|||
|---|---|---|---|
|
#18+
Получилось, что работа с открытием / закрытием файла- самая быстрая. Скорее всего дело в том, что накладные расходы на обслуживание коллекции с открытыми потоками выше, чем накладные расходы на открытие и закрытие файлов. Да и так проще код. Так как этот код выполняется только один раз, то я за простоту. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2018, 09:41 |
|
||
|
При работе с потоками СИЛЬНО растет используемая память
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovAlekseySQLНо почему- то ОЧЕНЬ сильно растет потребление памяти. При любых проблемах с памятью Вам поможет DrMemory. Очень рекомендую. им можно отлавливать: 1. переполнение буфера 2. использование после free ? и ещё выходы за пределы стекового массива или глобального массива он находит ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2018, 11:11 |
|
||
|
При работе с потоками СИЛЬНО растет используемая память
|
|||
|---|---|---|---|
|
#18+
а с Valgrind не сравнивали его? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2018, 11:11 |
|
||
|
При работе с потоками СИЛЬНО растет используемая память
|
|||
|---|---|---|---|
|
#18+
tip78им можно отлавливать: Да. И ещё утечки, неинициализированное чтение, неосвобождённые ресурсы и т.д. Сравнение в Валгриндом есть на сайте. Но лично для меня у Валгринда есть смертельный недостаток - не работает под Виндой. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2018, 11:43 |
|
||
|
При работе с потоками СИЛЬНО растет используемая память
|
|||
|---|---|---|---|
|
#18+
А ларчик просто открывался. Прозевал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2018, 14:17 |
|
||
|
При работе с потоками СИЛЬНО растет используемая память
|
|||
|---|---|---|---|
|
#18+
tip78а с Valgrind не сравнивали его? У меня из Qt Creator "Анализатор памяти Valgrind" писал ошибку: "Не удалось запустить программу. Путь или права недопустимы?" Так что я быстро на Intel- овский инструмент перепрыгнул. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2018, 09:31 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=39650411&tid=2017849]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
50ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
| others: | 14ms |
| total: | 168ms |

| 0 / 0 |
