Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.07.2014, 13:09   #1
mahatmaQL
Пользователь
 
Регистрация: 02.04.2014
Сообщений: 18
По умолчанию Ошибка Out of Memory

Здравствуйте! Помогите разобраться в причине возникновения ошибки Out of Memory.

Создается приложение типа WinHex. На форме StringGrid, заполняемая информацией из загружаемого файла. Кол-во колонок = 18, кол-во строк определяется длиной файла/16.

СпидБаттон залинкован на стандартном действии ActionList FileOpen.

Заголовок каждой строки должен показывать начальную позицию в байтах. Собственно, при формировании заголовка где-то в райне 6000000 строки возникает ошибка (пытаюсь открыть файл 300+МБ).

Код:
var
  fmEditor: TfmEditor;
  fOrigin: file;
  fname: string;

implementation

{$R *.dfm}

procedure TfmEditor.FormCreate(Sender: TObject);
const
  tabhead: array[1..18] of string = ('Offset','0','1','2','3','4','5','6','7',
           '8','9','10','11','12','13','14','15','');
var
  i: integer;
begin
  with sgTable do
  begin
     ColWidths[0]:=200;
     ColWidths[ColCount-1]:=200;
     for i:=0 to ColCount-1 do
     Cells[i,0]:=tabhead[i+1];
  end;
end;

procedure TfmEditor.AFOpenAccept(Sender: TObject);
var
  i,numstr: longword;
begin
  fname:=(Sender as TFileOpen).Dialog.FileName;
  AssignFile(fOrigin,fname);
  ReSet(fOrigin,1);
  if frac(FileSize(fOrigin)/16)<>0 then numstr:=round(int(FileSize(fOrigin)/16)+1);
  sgTable.RowCount:=numstr+1;
  for i:=1 to numstr-1 do
  begin
     sgTable.Cells[0,i]:=IntToStr((i-1)*16);
     Application.ProcessMessages;
  end;
end;
mahatmaQL вне форума Ответить с цитированием
Старый 31.07.2014, 13:46   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

ну у вас реально память кончается, чего удивлятся то?

не надо все в память грузить.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 31.07.2014, 13:48   #3
саша40
Участник клуба
 
Регистрация: 12.09.2012
Сообщений: 1,030
По умолчанию

Память надо выделить под этот файл. Функции GetMem и FreeMem.
Что нужно программисту: Компьютер, Среда программирование, Воображение, Прямые руки, Мозги, Знания этой среды программирования.
Программист-это профессия, а программирование-это моё хобби.
саша40 вне форума Ответить с цитированием
Старый 31.07.2014, 13:57   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от саша40 Посмотреть сообщение
Память надо выделить под этот файл. Функции GetMem и FreeMem.
кто вам эту чушь сказал?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 31.07.2014, 13:58   #5
саша40
Участник клуба
 
Регистрация: 12.09.2012
Сообщений: 1,030
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
кто вам эту чушь сказал?
Я знал это. Если памяти в адресном пространстве процесса не хватает, то надо выделить больше(если, конечно, ещё есть куда выделять).
Что нужно программисту: Компьютер, Среда программирование, Воображение, Прямые руки, Мозги, Знания этой среды программирования.
Программист-это профессия, а программирование-это моё хобби.
саша40 вне форума Ответить с цитированием
Старый 31.07.2014, 14:18   #6
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Цитата:
Я знал это. Если памяти в адресном пространстве процесса не хватает, то надо выделить больше(если, конечно, ещё есть куда выделять).
не пишите бред. Память - временное хранилище переменных данных.
Файл уже есть на ЖД, зачем его дублировать в памяти?
Про File Mapping прочитайте что-ли. Таким методом можно сотни гигабайт смотреть при 512 мб памяти ОЗУ.
Человек_Борща вне форума Ответить с цитированием
Старый 31.07.2014, 14:24   #7
mahatmaQL
Пользователь
 
Регистрация: 02.04.2014
Сообщений: 18
По умолчанию

мне не понятно следущее. допустим, я объявил таблицу размером 23.265.451 на 18. Она прорисовалась пустая. Было ли при этом выделено под каждую ячейку память или нет? Если было, то, формируя шапку, я просто присваиваю строку в уже выделеную память. Как тогда возникает нехватка памяти?
Если не было выделено, то нехватка памяти наступает где-то в районе 375000 строки. Допустим, под строку выделяется 8 байт. Тогда потребуется памяти около 3 МБ. Откуда out of memory?

И вообще, как тогда работают табличноподобные программы, типа Excel? Ведь в них можно загрузить файлы и больших размеров.
mahatmaQL вне форума Ответить с цитированием
Старый 31.07.2014, 14:39   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Эксель хранит иначе в первую очередь, да и подгрузка с диска есть.
Цитата:
Допустим, под строку выделяется 8 байт.
там выделяется в разы больше.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 31.07.2014, 14:45   #9
mahatmaQL
Пользователь
 
Регистрация: 02.04.2014
Сообщений: 18
По умолчанию

Т.е. единственный выход - прорисовывать таблицу и подгружать из файла нужно ровно столько, сколько помещается на видимой части таблицы?
mahatmaQL вне форума Ответить с цитированием
Старый 31.07.2014, 14:54   #10
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,762
По умолчанию

Цитата:
Сообщение от mahatmaQL Посмотреть сообщение
Т.е. единственный выход - прорисовывать таблицу и подгружать из файла нужно ровно столько, сколько помещается на видимой части таблицы?
Это будет идеальный вариант.
FaTaL вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка "out of memory" Rest_Tremor Общие вопросы Delphi 14 09.04.2013 10:03
Load exe into memory and run it from memory artush1984 Win Api 10 06.02.2012 18:43
Out of memory Bogoley4ik C++ Builder 3 09.04.2011 00:02
Ошибка Out of Memory kruftin Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 11.12.2010 18:46
Ошибка malloc(): memory corruption Роман Радер Общие вопросы C/C++ 6 03.10.2009 19:34