Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.02.24;
Скачать: [xml.tar.bz2];

Вниз

массивы   Найти похожие ветки 

 
Asker   (2003-02-13 01:37) [0]

У меня есть огромный динамический массив (до 2-3мб). Как эффективнее организовать вставку/удаление пары байт в произвольном месте?
Ведь если делать сдвигами, то придётся выделять память под временный массив, что как-то не хорошо.


 
Palladin   (2003-02-13 01:41) [1]

ИМХО
в данном случае следует использовать TList


 
Asker   (2003-02-13 01:42) [2]

так он же медленно работать будет


 
Palladin   (2003-02-13 01:50) [3]

TList хранит ссылки по принципу дин. массива, и совсем не медленнее если запись у тебя занимает больше 4 байт

считай сам, TList вставляет записи при помощи Move, толи мувить массив ссылок по 4 байта толи по SizeOf(здоровая запись).

Но если у тебя запись меньше 4 то придется сдвигами.


 
Asker   (2003-02-13 01:52) [4]

массив байт в виде PChar


 
Palladin   (2003-02-13 01:57) [5]

под временный массив выделять не надо
просто сделай ReallocMem
а потом Move начиная с вставляемой позиции на +1

хм... интересно сработает или нет... :)
сейчас попробую скажу...


 
Palladin   (2003-02-13 02:10) [6]

все нормально отработало, так что забудь про временные массивы


 
Ihor Osov'yak   (2003-02-13 02:19) [7]

А мне кажется, что нужно модель менять. Как-то не здорово из-за 4 байт 2-3 мегабайта гонять...


 
Palladin   (2003-02-13 02:23) [8]


> Ihor Osov"yak © (13.02.03 02:19)

а как тут поменяешь... все попытки обвешать доп информацией приведут к мнгновенному увеличению объема занимаемой памяти и соответственно времени обработки...


 
Ihor Osov'yak   (2003-02-13 02:32) [9]

Asker = Palladin ????

Если не так, то откуда Вам это известно, что в чела там обрабатывается ?

Имхо, в большинстве случаев при работе с большими обьемами информации/массивами очень полезно делать некую кластеризацию.. И как правило, это возможно...


 
Palladin   (2003-02-13 02:35) [10]

есть мысль хранить не одним массивом а несколькими ограничеными скажем по 1000 записей
сами массивы хранить в TList
и шоб скажем вставить в произвольное место, нужно будет всего лишь найти тот массив где это место имеет место :)

схемка

TList of dynamic array
1: 1 1 1 1 1
2: 1 1 1 1 1
3: 1 1 1 1 1

три дин массива
вставить в 7 место

побежали по массивам складывая их размер, добрались до 7 и добавили "2" таким образом что у нас получилось так

TList of dynamic array
1: 1 1 1 1 1
2: 1 2 1 1 1
3: 1
4: 1 1 1 1 1

думаю такая модель увеличит многократно производительность


 
Palladin   (2003-02-13 02:37) [11]

ну и подозрения :)


> Если не так, то откуда Вам это известно, что в чела там
> обрабатывается ?


Asker (13.02.03 01:52)
массив байт в виде PChar


 
Palladin   (2003-02-13 02:39) [12]

я ведь не знаю :)
я всего лишь предполагаю на основе сказаного челом


 
Ihor Osov'yak   (2003-02-13 03:12) [13]

2 Palladin © (13.02.03 02:39)

:-).

2 Palladin © (13.02.03 02:35)

Схем может быть много. В том числе, и предложенная Вами.


 
Radionov Alexey   (2003-02-13 07:40) [14]

>Asker (13.02.03 01:37)
Если необходимо вставлять элементы именно внутрь огромного массива, значит в массиве определен некоторый порядок (некоторая отсортированность имеется). Для таких кабанских данных имхо подходят структуры а-ля B-дерево, в которых сохраняется отсортированность => быстрый поиск и весьма дешевая вставка нового элемента в нужное место.


 
alexanderK2   (2003-02-13 09:31) [15]

Если на C++Builder, то можно использовать STL.
Очень удобная библиотека, для такого вида операций.


 
REA   (2003-02-13 10:54) [16]

Можно создать кэш и писать все изменения в него и работать с ним сначала, а потом с массивом. После нажатия кнопки Commit changes сделать синхронизацию кэша и данных. Сложновато реализовать конечно. Проще наверно как сказано выше разбить на блоки.


 
Leshiy   (2003-02-13 11:40) [17]

Можно попробовать указатели.


 
Чих-пых   (2003-02-13 13:38) [18]

А чем указатели помогут?


 
[lamer]Barmaglot   (2003-02-13 13:38) [19]

Указатели (особенно двухсторонние) могут увелитичь размер более чем в 2-3 раза... Если данные короткие (типа integer). Хотя вставлять и убирать из такого массива действительно намного дешевле.


 
[lamer]Barmaglot   (2003-02-13 13:45) [20]

Для массива могу посоветовать, не менять динамически после каждого изменения, а иметь динамический массив с некоторым запасом свободного места, например +10% размера массива на запас. После заполнения свободного места, увеличение массива на следующие 10% и т.д. При этом накладные расходы на добавления одной записи уменьшаются.


 
cdadmitriy   (2003-02-13 15:21) [21]

Я думаю нужно ( важно ) определиться что нужно скорость или
размер данных увеличение в 3 раза ( 2 указателя ) памяти даст
увеличение скорости ну и сделай тестовые примеры и определись


 
Asker   (2003-02-13 23:10) [22]

у меня есть насущная необходимость файл целиком помещать в память (2-3мб - это логический предел, в среднем будет прим. 500-700кб). Разбиение на блоки, пожалуй, будет самым приемлимым решением исходя из трудоёмкости и эффективности.
Искренне благодарен =)


 
Anatoly Podgoretsky   (2003-02-13 23:35) [23]

[lamer]Barmaglot © (13.02.03 13:38)
Новое слово в программировании - двухстороннии указатели


 
Думкин   (2003-02-14 06:23) [24]


> Asker (13.02.03 01:42)
> так он же медленно работать будет

А какие скоростные параметры нужны? Очень часто народ в скорости заблуждается. Я вот писал прогу в ней был логический и грфический пункт в цикле( %-))). По скорости я сильно грешил на логику, а оказалось что логика в 1000 раз быстрее обрабатывалась чем графика - тут и было самое слабое место.


 
Palladin   (2003-02-14 07:47) [25]

В данном случае, автор просил подсказать более оптимальную методику работы с массивом бинарных данных. Сказано же было в начале


Asker (13.02.03 01:52)
массив байт в виде PChar


Причем тут указатели, и одно/двусторонние списки? Про записи и размер записи было так же обговорено в начале.


 
Внук   (2003-02-14 09:20) [26]

Опять же посоветую книгу.
Род Стивенс. "Delphi. Готовые алгоритмы."

Там Вы сами выберите наиболее подходящее для конкретной ситуации решение. Есть и другие книги на эту тему.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2003.02.24;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.009 c
3-75787
Alexandr3
2003-02-06 12:11
2003.02.24
login failed


14-76180
Nemas
2003-02-08 04:19
2003.02.24
Вес программы


6-76067
Spy X
2003-01-02 21:11
2003.02.24
spyx@inbox.ru


14-76183
Помогите
2003-02-07 23:44
2003.02.24
доменное имя


6-76076
NewGuest
2003-01-01 16:29
2003.02.24
Конференция для всех людей работающих с сетью!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский