| Автор |
Сообщение |
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. Пишем во временный файл
|