Size: a a a

2020 February 10

SB

Sergey Bodrov in Delphi & Lazarus
Dmitry Mozulyov
Ты не понял? В принципе нет необходимости расходовать гигабайты оперативной памяти
Если про потоковую запись - то с этим я согласен, и выше компонент TZipper это как раз про это. А класс TTmpFileStream это альтернатива на случай, если уже есть рабочее решение на временных файлах и его можно быстро оптимизировать.
источник

PB

Pshemko Bzdeshko in Delphi & Lazarus
целый компонент, состоящий из трех строк кода? =D
источник

DB

Dmitry Belkevich in Delphi & Lazarus
да ладно :) если работает и полезен - почему нет
источник

DM

Dmitry Mozulyov in Delphi & Lazarus
Dmitry Belkevich
я так понял, что там память не расходуется
Без разницы. Он либо сохраняет XML, либо сохраняет ZIP. Да и судя по описанию, память как раз жрется нещадно, пока не возникнет OutOfMemory )
источник

PB

Pshemko Bzdeshko in Delphi & Lazarus
в современных распространенных ОС очень плохо обстоят дела с контролем свободного ОЗУ.. причем свопирование не панацея..
источник

DB

Dmitry Belkevich in Delphi & Lazarus
FILE_ATTRIBUTE_TEMPORARY
256 (0x100)
The file is being used for temporary storage.
For more information, see the Caching Behavior section of this topic.
источник

DB

Dmitry Belkevich in Delphi & Lazarus
там всё хитро, надо читать, я точно сам не помню
источник

DB

Dmitry Belkevich in Delphi & Lazarus
и лучше читать первоисточник - msdn. а не трактовки. как вариант - Рихтера
источник

SB

Sergey Bodrov in Delphi & Lazarus
Необходимость написать свой TMemoryStream возникла после проблем с памятью в круглосуточном продакшене с большой нагрузкой. Примерно через месяц-два начинают появляться проблемы с выделением больших блоков памяти, порядка 200 Мб. При этом свободной памяти в системе значительно больше. Для изучения вопроса и понадобилось городить свой огород для работы с памятью. Короче, с фрагментацией памяти бороться можно, но сложно. Проще работать с памятью как с файлом, тогда пофиг, что он физически из "лоскутков" состоит.
источник

DB

Dmitry Belkevich in Delphi & Lazarus
да, фрагментация бывает проблемой. памяти хватает, хотя массивы не создаются (потому что лежат как недавно обсуждали подряд в памяти). на 64х правда к счастью стало сильно проще
источник

DM

Dmitry Mozulyov in Delphi & Lazarus
Sergey Bodrov
Необходимость написать свой TMemoryStream возникла после проблем с памятью в круглосуточном продакшене с большой нагрузкой. Примерно через месяц-два начинают появляться проблемы с выделением больших блоков памяти, порядка 200 Мб. При этом свободной памяти в системе значительно больше. Для изучения вопроса и понадобилось городить свой огород для работы с памятью. Короче, с фрагментацией памяти бороться можно, но сложно. Проще работать с памятью как с файлом, тогда пофиг, что он физически из "лоскутков" состоит.
Ты уверен, что нужен TMemoryStream размером гигабайт? Может есть более человеческие решения?
источник

SB

Sergey Bodrov in Delphi & Lazarus
Dmitry Mozulyov
Ты уверен, что нужен TMemoryStream размером гигабайт? Может есть более человеческие решения?
Смотря, какая задача.
источник

DM

Dmitry Mozulyov in Delphi & Lazarus
Sergey Bodrov
Смотря, какая задача.
Ну вот я и спрашиваю. Что за задача?
источник

DB

Dmitry Belkevich in Delphi & Lazarus
всяко бывает ) иногда и нужно
источник

DM

Dmitry Mozulyov in Delphi & Lazarus
Потому что если речь идёт о XML и ZIP, то задача решается без TMemoryStream, причём можно обойтись штатными средствами
источник

SB

Sergey Bodrov in Delphi & Lazarus
Dmitry Mozulyov
Ну вот я и спрашиваю. Что за задача?
У меня, например, на сервер приходят SQL запросы и в ответ генерируется и отправляется по частям DataSet. А там могут быть миллионы строк. Да и в одной строке могут быть блобы на мегабайты.
источник

SB

Sergey Bodrov in Delphi & Lazarus
Кстати, кому надо сделать свой DataSnap с максимальной эффективностью - пользуйтесь. https://github.com/serbod/NovaLib/blob/master/DBFunc.pas
источник

SB

Sergey Bodrov in Delphi & Lazarus
function QueryToStream(ASql: TStrings; AParams: TParams; AStream: TStream): Boolean;
источник

SB

Sergey Bodrov in Delphi & Lazarus
function DatasetToStream(ADataSet: TDataSet; AStream: TStream; ACount: LongInt; var ARecNo: LongInt): boolean;
источник

SB

Sergey Bodrov in Delphi & Lazarus
И то же самое в обратную сторону
источник