powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Out of мemory
15 сообщений из 15, страница 1 из 1
Out of мemory
    #40084375
hlopotun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Разбираюсь с проблемой "Out of memory" в одном старом приложении при импорте больших AScii текстовых файлов.
В принципе где данные накапливаются понятно. Непонятно почему ошибка всегда происходит не в момент выделения ресурсов буферу в котором происходит накопление а в функции чтения строки из файла и конвертации её:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
........
  CP_OEMCP                 = 1;  
.......
FReader: TStreamReader;
.......
FOEMConvert :=  True;
.......

function TTextfileStream.ReadString: string;
var
  lStrA: AnsiString;
begin
  Result := FReader.ReadLine;
  if FOEMConvert and (Result <> '') then begin
    SetString (lStrA, PChar (Result), Length (Result)); // von PAnsiChar
    PWord (integer (lStrA) - 12)^ := CP_OEMCP;
    Result := string (lStrA);
    end;
end;



возможно это конечно совпадение и именно в этом месте строке не остаётся памяти занятой буффером но почему всегда именно тут.
Закралось сомнение в правильности реализации строки:
Код: pascal
1.
PWord (integer (lStrA) - 12)^ := CP_OEMCP;


не совсем её понимаю, выглядит как явное задание кодировки по адресу. Почему именно -12? Растолкуйте смысл?
Нет ли в этой функции неявной утечки?

Спасибо
...
Рейтинг: 0 / 0
Out of мemory
    #40084376
hlopotun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hlopotun,

по - 12 разобрался .
в остальном вопрос пока открыт
...
Рейтинг: 0 / 0
Out of мemory
    #40084377
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hlopotun
Deutschland, Deutschland über alles,
Über alles in der Welt,
Wenn es stets zu Schutz und Trutze
Brüderlich zusammenhält! ©
...
Рейтинг: 0 / 0
Out of мemory
    #40084383
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hlopotun
Непонятно почему ошибка всегда происходит не в момент выделения ресурсов буферу в котором происходит накопление а в функции чтения строки из файла и конвертации её

В данном коде конвертирование выделяет новую строку, в два раза больше имеющейся.

з.ы. Код - просто эталонный образец, как найти себе проблем на пятую точку.
...
Рейтинг: 0 / 0
Out of мemory
    #40084384
hlopotun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kazantsev Alexey
hlopotun
Непонятно почему ошибка всегда происходит не в момент выделения ресурсов буферу в котором происходит накопление а в функции чтения строки из файла и конвертации её

В данном коде конвертирование выделяет новую строку, в два раза больше имеющейся.

з.ы. Код - просто эталонный образец, как найти себе проблем на пятую точку.
^

он как бы и написан в 2005м году даже незнаю кем. По условию файл в Ascii. Вопрос в том насколько он корректен. Не происходит ли при этом утечки которая на мольшом числе итераций вылевается в "Out of memory".
...
Рейтинг: 0 / 0
Out of мemory
    #40084385
hlopotun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hlopotun
Kazantsev Alexey
пропущено...

В данном коде конвертирование выделяет новую строку, в два раза больше имеющейся.

з.ы. Код - просто эталонный образец, как найти себе проблем на пятую точку.
^

он как бы и написан в 2005м году даже незнаю кем. По условию файл в Ascii. Вопрос в том насколько он корректен. Не происходит ли при этом утечки которая на большом числе итераций вылевается в "Out of memory".
...
Рейтинг: 0 / 0
Out of мemory
    #40084390
hlopotun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
переделал так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
function TTextfileStream.ReadString: string;
//var
  //lStrA: AnsiString;
  function _Ansi2OEM(AnsiString: string): string;
  begin
    ANSIString := ANSIString + #0;
    CharToOEM(PChar(ANSIString), @ANSIString[1]);
    Delete(ANSIString, Length(ANSIString), 1);
    Result := ANSIString;
  end;
begin
  //Result := FReader.ReadLine;
  //if FOEMConvert and (Result <> '') then begin
    //SetString (lStrA, PChar (Result), Length (Result)); // von PAnsiChar
    //PWord (integer (lStrA) - 12)^ := CP_OEMCP;
    //Result := string (lStrA);
    //end;
  if FOEMConvert then
     result := _Ansi2OEM(FReader.ReadLine)
  else
     Result := FReader.ReadLine;
end;


посмотрим
...
Рейтинг: 0 / 0
Out of мemory
    #40084391
zedxxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hlopotun,
Код: pascal
1.
2.
3.
4.
5.
6.
7.
function StringToOem(const S: String): AnsiString;
begin
  SetLength(Result, Length(S));
  if S <> '' then begin
    CharToOem(PChar(S), PAnsiChar(Result));
  end;
end;


или
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
function AnsiStringToOem(const S: AnsiString): AnsiString;
begin
  Result := S;
  UniqueString(Result);
  if S <> '' then begin
    CharToOemA(PAnsiChar(Result), PAnsiChar(Result));
  end;
end;



https://stackoverflow.com/a/9689807
...
Рейтинг: 0 / 0
Out of мemory
    #40084392
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hlopotun
он как бы и написан в 2005м году

Он написан минимум под D2009.

hlopotun
Вопрос в том насколько он корректен.

Этот код натуральное садо-мазо:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
function TTextfileStream.ReadString: string;
var
  lStrA: AnsiString;
begin
  Result := FReader.ReadLine;
  if FOEMConvert and (Result <> '') then begin
    SetString (lStrA, PChar (Result), Length (Result)); // von PAnsiChar Преобразование раз
    PWord (integer (lStrA) - 12)^ := CP_OEMCP; Правильно делать по-другому: SetCodePage(RawByteString(lStrA), CP_OEMCP, False)
    Result := string (lStrA); Преобразование два
    end;
end;


Этот код может приводить к ошибкам в 64-битном режиме. И корректность преобразований под вопросом.
...
Рейтинг: 0 / 0
Out of мemory
    #40084393
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hlopotun,

А нельзя ли заменить этот стрим на обычное чтение текстового файла (ReadLn(T, ...))?
...
Рейтинг: 0 / 0
Out of мemory
    #40084394
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyА нельзя ли заменить этот стрим на обычное чтение текстового файла (ReadLn(T, ...))?

Можно, но его автор не знал о существовании SetTextBuf().
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Out of мemory
    #40084395
hlopotun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kazantsev Alexey
hlopotun,

А нельзя ли заменить этот стрим на обычное чтение текстового файла (ReadLn(T, ...))?

можно наверняка. Но я не буду. Тут такого наворочено вокруг ....
...
Рейтинг: 0 / 0
Out of мemory
    #40084413
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
var
  Reader: TStreamReader;
  s: string;
  OemEncoding: TEncoding;
begin
  OemEncoding := TEncoding.GetEncoding(CP_OEMCP);
  try
    Reader := TStreamReader.Create('e:\oemoem.txt', OemEncoding);
    try
      while not Reader.EndOfStream do
        s := Reader.ReadLine();
    finally
      Reader.Free();
    end;
  finally
    OemEncoding.Free();
  end;
...
Рейтинг: 0 / 0
Out of мemory
    #40084415
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite,

TStreamReader - тормоз .
...
Рейтинг: 0 / 0
Out of мemory
    #40084424
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey
X-Cite,

TStreamReader - тормоз .


Если его скорость работы удовлетворяет поставленной задаче, то норм.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Out of мemory
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]