www2.amit.ruФорум на www2.amit.ru 
 ° Начало ° Ответить ° Статистика ° Регистрация ° Поиск ° Участники ° Мануал °
Шкурка: 640 800 [1024] 95%     Шрифт: [aB] aBАватары: откл. [показать]
www2.AmIT.ru / Технический раздел / DELPHI (тип String в памяти)
. [1] . 2 . 3 . 4 . >> Показать все сообщения
Автор Сообщение
Flanker
Участник
#1 Дата: 03 03 2010 20:51:05 Ответить 

Кто знает как данные строки S of String распределяются в памяти ?

Нужно быстро загружать большые объемы данных до 2GB в строку типа String

Мама Стифлера
Участник...
#2 Дата: 03 03 2010 20:56:27 Ответить 

string не значит что delphi выделит тебе непрерывный кусок памяти
Нужно быстро загружать большые объемы данных до 2GB в строку типа String
имхо лучше делать подругому

DrPooh
Участник
#3 Дата: 03 03 2010 21:04:31 Ответить 

Flanker
Боюсь 2 Гб в памяти одним куском никак не лягут, надо более извращенные способы придумывать для этой задачи

Иван Иваныч
Участник
#4 Дата: 03 03 2010 21:09:50 Ответить 

надо более извращенные способы придумывать для этой задачи
malloc, например ;-)

Flanker
Участник
#5 Дата: 03 03 2010 21:24:12 Ответить 

Мама Стифлера
Уверен ??????..... то есть string хранится кусками?? ....тогда конечно побайтная запись в память не подойдет....

Есть конечно PChar......но не нравится его тупость обработки симовла Chr(0) как конец строки......а мне симовл ноль тоже нужен

DrPooh
Участник
#6 Дата: 03 03 2010 21:26:58 Ответить 

Flanker
Побайтовая запись пойдет как поток, а чего ты с ним дулать будешь - уже твоя фантазия подскажет

Flanker
Участник
#7 Дата: 03 03 2010 21:31:16 Ответить 

ак хранятся строки?

Поиск:

Тип String:
по смещению -4 храниться длина строки
по смещению -8 храниться счётчик ссылок на строку (когда он обнуляется строка уничтожается)
Сама строка располагается в памяти как есть - каждая буква занимает 1 байт.

Мама Стифлера
Участник...
#8 Дата: 03 03 2010 21:44:01 Ответить 

Уверен ??????
Более чем
google > Менеджер памяти Delphi

blagovoz
Участник...
#9 Дата: 03 03 2010 23:21:39 Ответить 

а я всегда считал что в стринг больше чем 255 символов невлазит...

blagovoz
Участник...
#10 Дата: 03 03 2010 23:24:13 Ответить 

можно попробовать чем нить из Windows API...

ogre
Участник...
#11 Дата: 04 03 2010 02:06:44 Ответить 

Flanker
а что за задача такая? Звучит странно (2 гига в строку - для чего?). Еще и проблема с #0.

Flanker
Участник
#12 Дата: 04 03 2010 09:30:14 Ответить 

ogre
Ладно пусть не 2 Гига, хотябы несколько МБ..... просто не люблю писать программы,....которые загибаются...как только ты открываешь большой файл....

Из файла загружаются блоки данных разного размера от 0 байт до 2 Гб....типа данных заранее неизвестен.....часто это может быть просто ANSI строка...а может и бинарный файл.

Информация выводится в StringGrid.... каждая ячейка типа String

Flanker
Участник
#13 Дата: 04 03 2010 09:34:39 Ответить 

blagovoz
Не WinAPI отпадает......из идейных соображений. Алгоритм должен быть красивый и надежный и простой....к тому же нечто подобное потом приедтся создавать на других платформах....а там WinAPI нет.

ogre
Участник...
#14 Дата: 04 03 2010 11:03:06 Ответить 

Flanker
blob-ы?
А зачем тебе весь файл/объект целиком? StringGrid - штука не для больших объектов.
В любом случае, для визуализации тебе не нужно больше нескольих килобайт максимум.

Jekil
Участник
#15 Дата: 04 03 2010 11:23:05 ° Поправил: Jekil Ответить 

Flanker
Из файла загружаются блоки данных разного размера от 0 байт до 2 Гб....типа данных заранее неизвестен.....часто это может быть просто ANSI строка...а может и бинарный файл.
про API вообще забудьте.
если первой мыслью было использовать стринги - возможно красивый и надежный и простой алгоритм у вас родится далеко не сразу :)))

не совсем понятны (точнее, совсем непонятны) условия задачи. я бы рекомендовать посмотреть в сторону TList, TCollection.

upd.
...а зачем в СтрингГрид выводить "бинарный файл" 2гб???... О_о

Flanker
Участник
#16 Дата: 04 03 2010 14:13:37 Ответить 

Jekil
Программа это очень простой Viewer бинарного файла определенной структуры. В переменной типа String, в частности в ячейках StringGrid.Cells[i.j] прекрасно хранятся фалйы по нескольку Мб, которые представлены в виде строки, копируются без потери.

Например строка может быть файл photo.jpeg, то есть содержать символы Chr(0), которые PChar принятый в WinAPI считает концом строки.

Моно конечно хранить блоки данных в отдельной структуре типа PByteArray......а в стринг грайд выводить первый килобайтик.....но что-то мне подсказывает что StringGrid прекрасно скушает и многомегабайтные строки String......в отличае от notepad.exe или Word.exe которые любят умирать когда в них файл откроешь бинарный на 5Mb

Zz_
Участник
#17 Дата: 04 03 2010 14:25:42 Ответить 

Flanker
Смысл?
Все равно 2 Гб никакая система тебе не выделит, все это будет идти через файл подкачки. Так что, ИМХО, проще уже и работать с файлами.

Мама Стифлера
Участник...
#18 Дата: 04 03 2010 14:27:33 Ответить 

Индусы нервно курят

ogre
Участник...
#19 Дата: 04 03 2010 15:14:00 Ответить 

Мама Стифлера
и густо красят стену йадом....нда...

Jekil
Участник
#20 Дата: 04 03 2010 15:18:17 ° Поправил: Jekil Ответить 

бинарного файла определенной структуры
тогда однозначно смотри TCollection и TCollectionItem. интерфейс - на TListView/OwnerData.
StringGrid "дурноватый" компонент, имхо.
очевидно, 2гига грузить в оперативу (файл подкачки) тоже "не айс". грузи кусками по мере необходимости вывода.

...а вообще такую кучу данных уже в БД хранить положено. SQLite вполне бы подошла.

ogre
Участник...
#21 Дата: 04 03 2010 15:28:50 Ответить 

для больших объектов есть поток. Или безтиповый файл. Сам не один вьювер создал, но никогда даже не думал пихать весь объект в память (неважно, какую). Для чего?

Flanker
Участник
#22 Дата: 04 03 2010 21:56:02 Ответить 

Народ ну что вы как маленькие.

Я не собираюсь делать то что неправильно....даже если кому-то кажется что я собираюсь это делать. SQL - курит в сторонке, как посредник и тормоз и вообще тут не причем. Как загрузить 2GB в память и прекрасно знаю....не нужны мне для этого другие компоненты....работать с памятью проще и быстрее напрямую.

А для чего тогда оперативка, если ее не использовать.???? Пакет может быть и маленьким порядка 1-2 килобайт....но программа должна работать и при размере пакета в несколько Гигабайт

Zz_
2ГБ не выделит, но более 1ГБ без проблем.

Flanker
Участник
#23 Дата: 04 03 2010 22:05:47 Ответить 

Суть в чем если StringGrid сможет хранить большие файлы пусть он это и делает, тогда весь алгоритм будет с два десятка строк.....чем проще и быстрее тем лучше.

Пока основной тормоз это побайтная запись из буфера скажем 100 Кб в тип стринг
For I:=0 to Size-1 do
Str:= Str + Chr(Buf[i]);

Задача положить Buf в стринг побыстрее.

Мама Стифлера
Участник...
#24 Дата: 04 03 2010 22:29:10 Ответить 

For I:=0 to Size-1 do
Str:= Str + Chr(Buf[i]);


setlength(Str, Size);
strcopy(pchar(Str), Buf);

Jekil
Участник
#25 Дата: 04 03 2010 22:30:06 ° Поправил: Jekil Ответить 

работать с памятью проще и быстрее напрямую.

For I:=0 to Size-1 do Str:= Str + Chr(Buf[i]);

эти две строчки друг другу цинично противоречат :)

если угодно загрузить два гига в оперативу тремя строчками кода - TMemoryStream и TStringStream в помощь. TFileStream тоже будет полезен.

p.s.
если бы некий "вьювер" (например, media player :)) попытался загрузить гиговый файл целиком в оперативу, я бы такой "вьювер" немедленно удалил, а имя "разработчика" на всякий случай запомнил :)))

ogre
Участник...
#26 Дата: 05 03 2010 03:54:44 Ответить 

Flanker
Я не собираюсь делать то что неправильно....даже если кому-то кажется - да это не кажется, это открытым текстом написано! Неверной дорогой идете товарищч.
для чего тогда оперативка, если ее не использовать. - в первую очередь - для запуска кода. Во вторую - для обработки / кэширования данных. Но не для хранения. Если грузоподъемность машины 500 кг, это вовсе не значит что при ее эксплуатации багажник должен быть забит хламом. Да и ездить быстрее она не станет.

но программа должна работать и при размере пакета в несколько Гигабайт - приведи хоть одну разумную причину объясняющую необходимость загрузки всех нескольих гигабайт бинарного (!!!) объекта в строку(!!!). Только потому что существует StringList?

Flanker
Участник
#27 Дата: 05 03 2010 12:24:26 Ответить 

ogre
Я не буду спорить...спасибо что объяснил зачем нужна оперативка.

Если уважаемый господин ogre допускает загрузку ненужных 2 Гб в память, то это неверный путь. Я бы так не сделал, только если нужен мгновенный доступ к каждому байту.

Как по вашему, для чего например текстуры хранят в опраивной памяти....мало того еще и видеопамять придумали.....но ладно я думаю что все прекрасно все понимают..

Мама Стифлера
А вот это уже по существу, сенкс большой......на делфи лет 7 не писал наверное.

Flanker
Участник
#28 Дата: 05 03 2010 12:31:26 Ответить 

ogre
И кстати вот вам причина:

1. Программа имеет доступ только к одному файлу размером 1 ГБ
2. Программа имеет доступ к всей свободной оперативной памяти
3. Программа вносит изменения почти в каждый байт первоначального файла
4. Записать изменения можно потом только в первоначальный файл.

Flanker
Участник
#29 Дата: 05 03 2010 12:36:20 Ответить 

Мама Стифлера
pchar(Str) ....проверю сегодня скорость доступа.....Стрингу....через PChar....надеюсь strcopy не затупит насчет Chr(0)...вроде не должна.

Мама Стифлера
Участник...
#30 Дата: 05 03 2010 12:39:57 Ответить 

Все причины надуманы
1. Читаем кусок
2. Правим
3. Пишем во временный файл


. [1] . 2 . 3 . 4 . >> Показать все сообщения
Ваш ответ
Жирный шрифт  Наклонный шрифт  Подчеркнутый шрифт  Ссылка на картинку  Ссылка  Preformatted Text 

» Логин  » Пароль 
Только зарегистрированные пользователи могут публиковать сообщения. Введите Ваши логин и пароль до отправки сообщения, или сначала зарегистрируйтесь.
 
 Начало

Онлайн: Гостей - 6
Участников - 6 [ Итого, Osrick, Незамужем, 3Gs, KVM, Насильник ]
Рекорд: 187 [01 06 2010 15:01:46]
Гостей - 53 / Участников - 134

Разработано: miniBB © 2001-2010.  Локализовано: ООО "АмИТ", 2005-2010. г. Благовещенск. GMT+9.