Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Tmemorystream и ошибка Out of memory


Автор: andrewr 30.1.2010, 21:19
Есть 2 Tmemorystream и в каждый надо загрузить файл по 300 мб, первый загружаю, на втором у меня вылетает ошыбка: Out of memory :-( Помогите пожалуста :-( 

Автор: kami 30.1.2010, 21:43
Почему не воспользоваться TFileStream?
Вообще, 600 Мб  - не предел для программы. Сейчас загрузил 2 файла по 330 (примерно) мегабайт - никаких проблем, кроме роста занятой памяти.
Короче говоря - код в студию smile

Автор: DarkProg 30.1.2010, 22:00
Цитата(andrewr @  30.1.2010,  21:19 Найти цитируемый пост)
Есть 2 Tmemorystream и в каждый надо загрузить файл по 300 мб, первый загружаю, на втором у меня вылетает ошыбка: Out of memory :-( Помогите пожалуста


А ОЗУ хоть хватает куда загружать???

Хотя судя по всему, Ошибка в 17-ой строке.

Автор: kami 30.1.2010, 22:03
Цитата(DarkProg @  30.1.2010,  22:00 Найти цитируемый пост)
А ОЗУ хоть хватает куда загружать???

ОЗУ тут ни при чем. Если оперативки не хватит - излишки будут сброшены в своп. Проблемы могут возникнуть только, если своп отключен или ему вручную задан слишком маленький размер.

Автор: Matematik 31.1.2010, 00:10
Кроме этого программа загружает другие большие данные в память?
Просто есть такая вещь как дефрагментация памяти и при определенных условиях может случиться, что  свободной памяти много, но нет непрерывного свободного куска размером 300МБ.

А так
Цитата(DarkProg @  30.1.2010,  22:00 Найти цитируемый пост)
Ошибка в 17-ой строке. 


Автор: andrewr 31.1.2010, 00:38
Код как таковой дать не могу smile Есть файл 300 мб он криптированый - криптированый smile Я загружаю файл с стреам и передаю стрим в функцию которая раскриптовывает по блоку и записывает в выходной стрим который при ините равен 0, и со временем возврастает до 300 мб. Рамы на компе 3гб и свап 3гб. Еще прикол в том что оно работало несколько дней, и сегодня вдруг начала ошыбка выскакывать :( 

код приблизительно такой:

Код

var
  in_file, out_file:tmemorystream;
  b:byte;
///
in_file:=tmemorystream.create;
out_file:=tmemorystream.create;
in_file.loadfromfile('c:\test_in.bin');
in_file.position:=0;

//
while in_file.position<in_file.size do
begin
in_file.read(b,1);
b:=b xor $11;
out_file.write(b,1);
end;

//
out_file.savetofile('c:\test_out.bin');
in_file.free;
out_file.free;


во время цыкла вылетает ошыбка - когда уже размер програмы в раме доходит до 512-514 мб(как когда).

Автор: kami 31.1.2010, 01:15
Повторю вопрос - 
Цитата(kami @  30.1.2010,  21:43 Найти цитируемый пост)
Почему не воспользоваться TFileStream?

Тем более, что ничего специфического для TMemoryStream не используется.

Автор: CodeMonkey 31.1.2010, 10:28
Так не загружайте файл целиком-то!
Обрабатывайте его кусками по 10 Мб.

Автор: Matematik 31.1.2010, 13:10
andrewr, 
Цитата(andrewr @  31.1.2010,  00:38 Найти цитируемый пост)
Рамы на компе 3гб и свап 3гб.

В обычных условиях одной программе доступно только 2ГБ.

Возьми последнюю версию FastMM http://sourceforge.net/projects/fastmm/
Подключи к проекту FastMM4.pas первым модулем, так
Код

program Project1;

uses
  FastMM4,
  Forms,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
  Application.Initialize;


включи в свойствах проекта отладочную версию Build Configuration = Debug
в папку с *.exe положи FastMM_FullDebugMode.dll
откомпилируй свою программу, запусти чтоб ошибка появлялась
и если были утечки памяти, после закрытия программа выдаст окошко с соответствующим сообщением и в файл имяпрограммы_MemoryManager_EventLog.txt сохраниться подробный отчет где\что "подтекает"

Плюс посмотри в папке demo есть пример Usage Tracker, он показывает состояние памяти программы, может действительно её не хватает.


Автор: Лапоть 2.2.2010, 10:43
А зачем открывать ВТОРОЙ поток? Считал в первый и юзай его свойство Memory для побайтового декриптования, а потом сохрани в файл под нужным именем.

Автор: artsb 2.2.2010, 11:00
Цитата(kami @  31.1.2010,  01:15 Найти цитируемый пост)
Повторю вопрос - 
Цитата(kami @  30.1.2010,  21:43 Найти цитируемый пост)
Почему не воспользоваться TFileStream?

Тем более, что ничего специфического для TMemoryStream не используется. 


Согласен с kami. Зачем юзать TMemoryStream, если можно использовать TFileStream. Конечно будет работать немного медленнее, но так хотя бы можно проверить была ли проблема в оперативке.

Автор: Mikel 3.2.2010, 12:08
Еще придирки принимаются? smile я бы написал все же:
Код

while in_file.read(b,1)=1 do
begin
b:=b xor $11;
out_file.write(b,1);
end;

Автор: andrewr 3.2.2010, 20:59
Сделал Tfilestreamб проблема решилась smile Всем спасибо smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)