![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Форумчанин
Регистрация: 16.10.2008
Сообщений: 205
|
![]()
Пишу логер к одному прибору. Т.к. кроме простой записи данных в файл, необходимо выводить график и выполнять некоторые действия с данными, их нужно сохранять в память. Чтобы заранее не занимать много памяти решил сделать массив динамическим. Выделяю массив какой-то длинны, когда он заполняется, копирую данные в другой массив, увеличиваю длину первого, копирую данные в первый, убиваю второй. Естественно это занимает кучу времени, и пока все это происходит, теряется некоторое количество данных.
Как этого избежать? Я понимаю что выделение памяти процесс не быстрый, но может есть способы как решить данную задачу? |
![]() |
![]() |
![]() |
#2 |
personality
Старожил
Регистрация: 28.04.2009
Сообщений: 2,899
|
![]()
А данные какие ?
Просто числа, вещественные, например ? Тогда всё очень просто. Заведите дин массив, примерно того размера какого нужен график, ну например размер графика 1000 пикселей, вот и сделайте тысячу элементов. Заведите переменную, указывающую текущую позицию сохраняемого элемента(для примера Cur), и переменную указывающую текущий размер массива(len). При получении очередного числа в массив проверяйте превысила ли cur len (cur > len) если да, то записывайте в начало массива, и cur присвойте 0 (для дин массивов индексация с 0), и запись производите в ячейку с индексом cur. Вывод графика можно сделать тоже достаточно просто, если Вы , конечно уже не используете какой-нибудь Tchart : берем Timage и наносим на него точку с данными из ячейки Cur (по у, ибо функция от времени, а по x - просто край графика), потом делаем image.canvas.copyrect со сдвигом на 1 пиксель, и далее повторяем цикл приема сохранения и вывода очередного значения Если понадобится поменять размер массива - функция setlength и переменную len не забыть поменять |
![]() |
![]() |
![]() |
#3 |
Форумчанин
Регистрация: 16.10.2008
Сообщений: 205
|
![]()
График нужен полный, т.е. строится не по последнему отрезку данных, а по всему принятому массиву, по этому весь массив приходится хранить в памяти. А сколько именно будет данных заранее не известно, поэтому и было решено массив делать динамическим. Собственно вся проблема в том, что изменение размера массива через функцию setlength происходит очень медленно, и пока это происходит теряется некоторое количество данных приходящих на порт.
Последний раз редактировалось gusluk; 13.10.2011 в 09:38. |
![]() |
![]() |
![]() |
#4 | |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
![]() Цитата:
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
|
![]() |
![]() |
![]() |
#5 |
Форумчанин
Регистрация: 16.10.2008
Сообщений: 205
|
![]()
А разве можно менять длину массива без потери хранящихся в нем данных?
|
![]() |
![]() |
![]() |
#6 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
![]()
SetLength это без проблем делает
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
![]() |
![]() |
![]() |
#7 |
Форумчанин
Регистрация: 16.10.2008
Сообщений: 205
|
![]()
Аватар, большое спасибо! Был уверен что при использовании SetLength, массив обнуляется, и даже мысли не возникло проверить, а так ли это.
|
![]() |
![]() |
![]() |
#8 | |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
![]() Цитата:
Дело в том, что операция выделения памяти - это весьма затратная по времени операция. сравните по быстродействию: Код:
Код:
p.s. впрочем. проверьте самостоятельно. Если Вас устроит быстродействие Вашего кода с выделением памяти по одному элементу, то можно и заморачиваться с предложенной мною оптимизацией (выделение памяти блоками) Последний раз редактировалось Serge_Bliznykov; 13.10.2011 в 11:36. Причина: увеличил количество циклов. Иначе вообще не видно разницы... :) |
|
![]() |
![]() |
![]() |
#9 |
personality
Старожил
Регистрация: 28.04.2009
Сообщений: 2,899
|
![]()
Setlength, емнип, создает новый массив новой длины, копирует туда из старого, и меняет ссылку со старого на новый массив. Чем меньше сетленсов, тем лучше для производительности
Последний раз редактировалось phomm; 13.10.2011 в 12:37. |
![]() |
![]() |
![]() |
#10 |
Форумчанин
Регистрация: 16.10.2008
Сообщений: 205
|
![]()
Думаю что выделение памяти по одному не есть гуд. Сейчас сначала выделяю память на 1000 элементов, при заполнении массива увеличиваю его длину но половину.
|
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Динамический массив Си | GoRdoN 17 | Помощь студентам | 9 | 25.01.2013 15:23 |
Динамический массив | botaniQQQ | Паскаль, Turbo Pascal, PascalABC.NET | 3 | 27.06.2011 08:44 |
Динамический массив, массив указателей | alexalisa | Паскаль, Turbo Pascal, PascalABC.NET | 4 | 22.04.2011 21:33 |
Динамический массив - или всё таки не динамический? | vedro-compota | Общие вопросы C/C++ | 30 | 10.12.2010 23:22 |
Динамический массив | Porsche | Общие вопросы C/C++ | 5 | 26.05.2010 08:04 |