Форум программистов, компьютерный форум, киберфорум
Delphi
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.74/34: Рейтинг темы: голосов - 34, средняя оценка - 4.74
 Аватар для ISerg1986
16 / 16 / 13
Регистрация: 12.01.2014
Сообщений: 177

Ошибка out of memory

27.11.2014, 16:30. Показов 7363. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пишу программу.
Программа работает с текстовыми файлами.
Краткий алгоритм.
Прочитать 1й файл построчно - создать массив. Прочитать 2й файл построчно - создать массив.
Из этих 2х массивов создать 3й массив, выбрав нужные значения из 1го и 2го.
Работать с 3м массивом - выбирать нужные значения в 4й.
Все значения 4го массива записать в файл.

Проблема такая - при работе с текстовыми файлами около 2 мб, всё отлично работает.
Когда размер файлов больше 10 мб - программа пишет Out of memory.

Мой код написан не лучшим образом, но я не вижу ничего криминального. Не знаю, что можно кардинально улучшить.
Пожалуйста, подскажите что в моём коде вызывает эту ошибку. Что можно исправить, что улучшить.

Понимаю, что кода много, но хотя бы часть. А вдруг увидите то, что вызывает эту ошибку.
Повторюсь, с файлами до 2 мб, всё отлично работает.

Добавлено через 2 минуты
Текст программы не влез сюда. Странно. Код содержит всего 18182 символа, что не много.
Зачем делать ограничение до 10000 символов? Ведь есть программы и побольше.
В любом случае, разместил код тут.http://ontext.info/62429
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.11.2014, 16:30
Ответы с готовыми решениями:

Ошибка Out of memory
При шифровании файла размером более 100мб вылетает ошибка "Out of memory'' - почитал и понял что это из-за недостатка выделенной памяти на...

Ошибка: Out of Memory
XE-5 AllocMemSize: Integer deprecated; {Unsupported} AllocMemCount: Integer deprecated; {Unsupported} а чем же тогда ловить того,...

Ошибка out of memory
Всем привет! При загрузке файла выше 200-300 мб вылазит ошибка out of memory Вот сам код как я загружаю procedure...

21
 Аватар для FaTaL-CS
73 / 74 / 23
Регистрация: 14.10.2013
Сообщений: 549
27.11.2014, 16:54
Очень много там у тебя кода. Но точно могу сказать, что ты не освобождаешь память от ненужных тебе объектов.
0
 Аватар для ISerg1986
16 / 16 / 13
Регистрация: 12.01.2014
Сообщений: 177
27.11.2014, 18:08  [ТС]
Цитата Сообщение от FaTaL-CS Посмотреть сообщение
Очень много там у тебя кода.
Согласен, но код простейший.
И освобождать память от чего?
Переменные перезаписываются.
Массивы, как только объединил два в третий (новый) - то сразу эти два прибил.
Delphi
1
2
SetLength(TABLE_USL_SUM,0);
SetLength(TABLE_USL,0);
А больше и ничего нет...

Добавлено через 5 минут
Можно конечно, оптимизировать код - заменить кое что, убрать пару переменных - но смысл?
Они роли не играют, как я думаю. Хотя, чтобы уменьшить код - я сделаю это.

Программа то в принципе такая
-------------------
Поток

Цикл1-Конец цикла1
Массив1

Цикл2-Конец цикла2
Массив2

Цикл3-Конец цикла3
Массив3=объединение Массива1 и Массива2
Уничтожаем Массив1 и Массив2

Цикл4 - работа с массивом 3-Конец цикла4
Результат массив 4
Вывод массива 4 в файл

Конец потока
-------------------------
Сплошные циклы и массивы. Больше ничего и нет.

Добавлено через 6 минут
И ещё хотел спросить - может есть какой-то инструмент, который позволит мне поймать эту ошибку?
Понять, что происходит.
0
 Аватар для Mawrat
13116 / 5897 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
28.11.2014, 09:16
ISerg1986, в программе экземпляры TMyThread (TThread) не уничтожаются и остаются в памяти. Чтобы экземпляр TThread автоматически уничтожился при завершении метода Execute(), надо задать свойство:
MyThread.FreeOnTerminate := True;
Этот код можно добавить прямо в самое начало тела метода MyThread.Execute():
Delphi
1
2
3
4
5
6
procedure MyThread.Execute;
...
begin
  FreeOnTerminate := True;
...
end;
0
 Аватар для ISerg1986
16 / 16 / 13
Регистрация: 12.01.2014
Сообщений: 177
28.11.2014, 19:17  [ТС]
Цитата Сообщение от Mawrat Посмотреть сообщение
ISerg1986, в программе экземпляры TMyThread (TThread)
Спасибо за совет. Добавил это в код.

В результате долгого поиска, нашел ошибку. И это странно.
А именно - ошибка в задании величины массива. Я задавал массивы размером 1 и в случае вставки нового элемента, увеличивал размер массива на 1. Логично? И с файлами до 2МБ всё работало.
С файлами большего размера - вылетала ошибка. Что странно. Я задал массив побольше - 1000000 строк и всё заработало.
Но это не есть гуд. Не логично. Массив то динамический.


Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
//РАБОТА С H ФАЙЛОМ В ЦИКЛЕ
//Указываем размер массива
SetLength(TABLE_USL, 1);//ВОТ ОНА ОШИБКА. НАДО ЗАДАТЬ SetLength(TABLE_USL, 1000000); 
 
//Указываем размер массива отделений (используется внутри массива TABLE_USL)
SetLength(TABLE_OTDEL, 1);
 
 
//Очищаем и обнуляем переменные
current_string:='';//Текущая строка
counter:=0;//Счётчик
income_tags:=0;//Флаг интересующих нас тегов
PODR:=0;IDSERV:=0;PROFIL:=0;DATE_IN:='';DATE_OUT:='';DS:='';RAZDEL_USL:=0;CODE_USL:='';
all_otdel:='';//Переменная содержащая все отделения
OTDEL_records_count:=0;  //Число непустых записей в массиве
otdel_exist:=1;
 
 
AssignFile (H_input_file, H_input_file_path);
Reset (H_input_file);
while not EOF(H_input_file) do
begin
//Точка начала чтения H файла
H_file_begin:
readln(H_input_file, current_string);
 
//Получение содержимого тегов
//Содержимое интересующих нас тегов находится между тегов USL и /USL
//Если строка содержит тег USL, то значит далее будут интересующие нас теги
if(CountPos('<USL>',current_string)>0) then begin income_tags:=1;
//Переходим к точке начала чтения H файла, чтобы не выполнять инструкции ниже (экономим время)
goto H_file_begin; end;
//Если строка содержит тег /USL, то значит интересующие нас теги закончились
if(CountPos('</USL>',current_string)>0) then begin income_tags:=0; end;
 
 
 
//Если флаг интересующих нас тегов активен
if (income_tags=1)then begin
//Если строка содержит тег IDSERV, то получаем его содержимое, заменяя в тексте точку на запятую
if(CountPos('<IDSERV>',current_string)>0) then begin IDSERV:=StrToFloat(StringReplace(get_stext('<IDSERV>','</IDSERV>',current_string),'.',',',[rfReplaceAll] )); end;
//Если строка содержит тег PODR, то получаем его содержимое, заменяя в тексте точку на запятую
if(CountPos('<PODR>',current_string)>0) then begin PODR:=StrToFloat(StringReplace(get_stext('<PODR>','</PODR>',current_string),'.',',',[rfReplaceAll] )); end;
//Если строка содержит тег PROFIL, то получаем его содержимое, заменяя в тексте точку на запятую
if(CountPos('<PROFIL>',current_string)>0) then begin PROFIL:=StrToFloat(StringReplace(get_stext('<PROFIL>','</PROFIL>',current_string),'.',',',[rfReplaceAll] )); end;
//Если строка содержит тег DATE_IN, то получаем его содержимое
if(CountPos('<DATE_IN>',current_string)>0) then begin DATE_IN:=get_stext('<DATE_IN>','</DATE_IN>',current_string);  end;
//Если строка содержит тег DATE_OUT, то получаем его содержимое
if(CountPos('<DATE_OUT>',current_string)>0) then begin DATE_OUT:=get_stext('<DATE_OUT>','</DATE_OUT>',current_string);  end;
//Если строка содержит тег DS, то получаем его содержимое
if(CountPos('<DS>',current_string)>0) then begin DS:=get_stext('<DS>','</DS>',current_string);  end;
//Если строка содержит тег RAZDEL_USL, то получаем его содержимое, заменяя в тексте тире на запятую
if(CountPos('<RAZDEL_USL>',current_string)>0) then begin RAZDEL_USL:=StrToFloat(StringReplace(get_stext('<RAZDEL_USL>','</RAZDEL_USL>',current_string),'-',',',[rfReplaceAll] )); end;
 
//Если строка содержит тег CODE_USL, то получаем его содержимое, заменяя в тексте точку на запятую
if(CountPos('<CODE_USL>',current_string)>0) then begin CODE_USL:=get_stext('<CODE_USL>','</CODE_USL>',current_string);
//Так как тег CODE_USL является последним интересующим нас тегом - то мы вставляем новый элемент в массив и увеличиваем значение счётчика
 
 
 
//Вставка элементов в массив TABLE_USL
TABLE_USL[counter,1]:=IDSERV;
TABLE_USL[counter,2]:=PODR;
TABLE_USL[counter,3]:=PROFIL;
TABLE_USL[counter,4]:=DATE_IN;
TABLE_USL[counter,5]:=DATE_OUT;
TABLE_USL[counter,6]:=DS;
TABLE_USL[counter,7]:=RAZDEL_USL;
TABLE_USL[counter,8]:=CODE_USL;
 
//Увеличиваем размер массива
SetLength(TABLE_USL, Length(TABLE_USL)+1);//И ЭТО ОШИБКА?
 
 
 
//Работа с массивом TABLE_OTDEL
//Смотрим - есть ли у нас такой отдел, делим на 10000 чтобы убрать нули
if(CountPos(' '+floattostr(PODR/10000)+' ',all_otdel)=0) then
begin
//Вставка элементов в массив TABLE_OTDEL
TABLE_OTDEL[OTDEL_records_count]:=PODR/10000;
//Увеличиваем размер массива
SetLength(TABLE_OTDEL, Length(TABLE_OTDEL)+1);
//Добавляем отдел в переменную
all_otdel:=all_otdel+' '+floattostr(PODR/10000)+' ';
//Увеличиваем число непустых записей в массиве
OTDEL_records_count:=OTDEL_records_count+1;
end;
//Конец работы с массивом
 
 
 
 
//Увеличиваем значение счётчика
counter:=counter+1;
 
 
end;
//Конец проверки на тег  CODE_USL
 
end;
//Конец проверки на флаг  интересующих нас тегов
 
 
 
 
end;
CloseFile (H_input_file);
//Запоминаем количество непустых записей в массиве
H_records_count:=counter;
//КОНЕЦ РАБОТЫ С H ФАЙЛОМ В ЦИКЛЕ
0
пофигист широкого профиля
4770 / 3205 / 862
Регистрация: 15.07.2013
Сообщений: 18,613
28.11.2014, 19:25
Цитата Сообщение от ISerg1986 Посмотреть сообщение
И это странно.
А именно - ошибка в задании величины массива. Я задавал массивы размером 1 и в случае вставки нового элемента, увеличивал размер массива на 1. Логично?
Если однократно то логично. А так память фрагментируется и в результате кончается.
0
 Аватар для ISerg1986
16 / 16 / 13
Регистрация: 12.01.2014
Сообщений: 177
28.11.2014, 19:59  [ТС]
Цитата Сообщение от northener Посмотреть сообщение
Если однократно то логично.
Массив "размером 1", задан однократно (а зачем многократно то?).
Далее в цикле идёт увеличение его размера.
Delphi
1
SetLength(TABLE_USL, Length(TABLE_USL)+1);
И это вызывало ошибку, но только в файлах более 2 МБ.
Например файл 1.5 МБ - около 70.000 строк программа обрабатывала нормально.
0
пофигист широкого профиля
4770 / 3205 / 862
Регистрация: 15.07.2013
Сообщений: 18,613
28.11.2014, 21:26
Цитата Сообщение от ISerg1986 Посмотреть сообщение
Далее в цикле идёт увеличение его размера.
И вот это уже неоднократно. "Увеличение" размера в общем случае это выделение нового блока памяти нужного размера и копирование в него информации из старого. Затем старый возвращается в систему. Рано или поздно в памяти может уже и не найтись достаточно большого непрерывного блока памяти.
0
 Аватар для ISerg1986
16 / 16 / 13
Регистрация: 12.01.2014
Сообщений: 177
29.11.2014, 12:04  [ТС]
Цитата Сообщение от northener Посмотреть сообщение
И вот это уже неоднократно. "Увеличение" размера в общем случае это выделение нового блока памяти нужного размера и копирование в него информации из старого. Затем старый возвращается в систему. Рано или поздно в памяти может уже и не найтись достаточно большого непрерывного блока памяти.
Извините, но я вас не очень понимаю.

Что плохого, что я выделяю новый блок памяти (ячейку) для следующего значения массива?
Я увеличиваю массив - его размер.

Или вы хотите сказать, что этим кодом
Delphi
1
SetLength(TABLE_USL, Length(TABLE_USL)+1);
Я создаю новый массив, размером на единицу больше, перезаписываю содержимое старого массива в новый и далее работаю с новым?
А куча старых массивов остаётся в памяти? Это странно...
Я же задал только один массив (в var) и далее работаю с его размером. Установлю размер 10 и уничтожу все элементы массива, кроме первых 10.
А если 0 то "уничтожу" массив.
0
пофигист широкого профиля
4770 / 3205 / 862
Регистрация: 15.07.2013
Сообщений: 18,613
29.11.2014, 14:15
Цитата Сообщение от ISerg1986 Посмотреть сообщение
Или вы хотите сказать, что этим кодом
SetLength(TABLE_USL, Length(TABLE_USL)+1);
Я создаю новый массив, размером на единицу больше, перезаписываю содержимое старого массива в новый и далее работаю с новым?
Угу. А как иначе увеличить размер массива?
0
 Аватар для ISerg1986
16 / 16 / 13
Регистрация: 12.01.2014
Сообщений: 177
29.11.2014, 18:20  [ТС]
Цитата Сообщение от northener Посмотреть сообщение
Угу. А как иначе увеличить размер массива?
А как тогда удалить старый массив? И почему он сам не удаляется?

Я же сказал программе не создавать новый массив, а увеличить размер существующего массива.
И как она это сделает - создаст новый, перезапишет старый и т.д. мне всё равно.
А Delphi похоже создаёт новые массивы и не удаляет старые? Т.е. это глюк делфи?
0
10 / 10 / 4
Регистрация: 14.01.2010
Сообщений: 80
29.11.2014, 19:13
что за бред? никакие новые массивы не создаются SetLength - увеличивает размер существующего массива.
http://www.delphibasics.ru/SetLength.php

Добавлено через 4 минуты
Выложите весь проек.
0
пофигист широкого профиля
4770 / 3205 / 862
Регистрация: 15.07.2013
Сообщений: 18,613
29.11.2014, 22:02
Цитата Сообщение от ISerg1986 Посмотреть сообщение
А как тогда удалить старый массив? И почему он сам не удаляется?
Я же сказал программе не создавать новый массив, а увеличить размер существующего массива.
И как его увеличить? По определению массив должен занимать непрерывный блок памяти нужного размера. При первом вызове SetLength выделяется в памяти блок заданного размера. После этого в программе может быть еще куча запросов на выделение блоков памяти для других нужд. Т.е. память сразу за тем блоком уже чем-то будет занята. (На самом деле уже сразу после первого вызова может оказаться что память за верней границей блока давно занята). И таким образом увеличить размер того блока ну никак не получится. Только выделить в другом месте памяти новый блок большего размера и скопировать в него содержимое старого.
0
10 / 10 / 4
Регистрация: 14.01.2010
Сообщений: 80
29.11.2014, 23:04
Цитата Сообщение от northener Посмотреть сообщение
И как его увеличить? По определению массив должен занимать непрерывный блок памяти нужного размера. При первом вызове SetLength выделяется в памяти блок заданного размера. После этого в программе может быть еще куча запросов на выделение блоков памяти для других нужд. Т.е. память сразу за тем блоком уже чем-то будет занята. (На самом деле уже сразу после первого вызова может оказаться что память за верней границей блока давно занята). И таким образом увеличить размер того блока ну никак не получится. Только выделить в другом месте памяти новый блок большего размера и скопировать в него содержимое старого.
Это называется фрагментация. Ничего не мешает "разнести" массив по разным блокам памяти и работать с фрагментированным массивом. Это если компелятор работает действительно так, как Вы пишите, насколько я знаю, все-таки механизм немного посложнее. Но суть не в этом. В любом случае задача увеличить размер массива полностью ложится на SetLength, как он это будет делать (переносить весь массив в новую область памяти или фрагментировать его или еще что-то) - Вас не должно заботить и "подчистить" память за собой - это задача SetLength.

Это можно легко проверить следующим кодом:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var
  mass1, mass2 : array of integer;
begin
  SetLengTh(mass1, 0);
  SetLengTh(mass2, 0);
 
  while true do
  begin
    SetLengTh(mass1, LengTh(mass1)+1);
    SetLengTh(mass2, LengTh(mass2)+1);
    if LengTh(mass1) > 1000 then
    begin
      SetLengTh(mass1, 1);
      SetLengTh(mass2, 1);
    end;
  end;
 
end;
т.к. память выделяется начала для одного массива, затем второй занимает следующую ячейку, и так оба массива копируются, оставляя за собой тонны мусора. После 1000 итерации длинна последних копий массива станет = 1 и цикл повторится. Но, разочарую, Вы никогда не получите утечки памяти! Даже по диспетчеру задач видно, что память никуда не уходит, даже если увеличить цикл до 1 000 000 итераций.
0
пофигист широкого профиля
4770 / 3205 / 862
Регистрация: 15.07.2013
Сообщений: 18,613
30.11.2014, 03:15
Цитата Сообщение от Duss Посмотреть сообщение
Это называется фрагментация. Ничего не мешает "разнести" массив по разным блокам памяти и работать с фрагментированным массивом. Это если компелятор работает действительно так, как Вы пишите, насколько я знаю, все-таки механизм немного посложнее. Но суть не в этом. В любом случае задача увеличить размер массива полностью ложится на SetLength, как он это будет делать (переносить весь массив в новую область памяти или фрагментировать его или еще что-то) - Вас не должно заботить и "подчистить" память за собой - это задача SetLength.
Вот это действительно бред. Уж извини.

Добавлено через 19 минут
P.S. Ну нет у меня ссылки на пруфлинк о менеджере памяти ОС.
У меня вообще сейчас почти ничего нет. Сдохли два жестких диска из трех. Потерял кучу всего нужного. ОС пришлось переустановлять заново.
Может кто из модераторов ака главных спецов форума даст ссылку ТС на такой пруфлинк?
0
10 / 10 / 4
Регистрация: 14.01.2010
Сообщений: 80
30.11.2014, 12:10
А что в поисковиках тебя забанили?
http://yandex.ru/yandsearch?te... C0%2C0%2C0
Вот это действительно бред. Уж извини.
так запусти написанный мной выше код. Почему же он тогда не вызывает ну никаких утечек памяти?
Чудеса?
0
Пишу на Delphi...иногда
 Аватар для cotseec
1423 / 1278 / 286
Регистрация: 03.12.2012
Сообщений: 3,914
Записей в блоге: 5
30.11.2014, 13:37
Цитата Сообщение от Duss Посмотреть сообщение
не вызывает ну никаких утечек памяти
SetLength сам по себе не вызовет и дело тут не в утечках (касательно Out of memory), а в вероятной дефрагментации памяти, о чем и упоминал тов. northener, если покопаться в модуле System (где описан SetLength), то можно встретить несколько функций, предназначенных для распределения памяти в массивах элементов различных типов (строки и числовые массивы), в каждой из них имеются строки, отвечающие за соблюдение условия
Цитата Сообщение от northener Посмотреть сообщение
непрерывный блок памяти нужного размера.
что при больших объемах перераспределяемой памяти под массив (как имеется у ТС) очень даже вызовет дефрагментацию, выход - заведомо выделять значительно бОльший объем памяти, и перераспределять его как можно реже, что ТС с успехом и проделал в последствии или изменить алгоритм, если такое возможно

Плохие указатели
...динамические массивы могут перемещаться по памяти, если их размер меняется вызовами SetLength...
0
 Аватар для ISerg1986
16 / 16 / 13
Регистрация: 12.01.2014
Сообщений: 177
30.11.2014, 14:11  [ТС]
Я не очень понял.
Почему я
1) указал делфи тип массива
2) указал делфи размер массива - единица
3) сказал - увеличь размер на единицу, если я буду вставлять что-то новое в массив
А делфи мне насоздавала кучу непонятных массивов в памяти и вконце выдала ошибку?
Это не логично. Инструкции были чёткие и однозначные.

Разработчику не важно, что и как будет делать компилятор, среда разработки, встроенные функции. Это их задачи и задачи разработчиков языка.
Это в каком то смысле инкапсуляция. Мне кажется, что это ошибка делфи (языка паскаль).

Я понимаю, что есть дефрагментация памяти, распределение памяти в массивах элементов различных типов и т.д., но разработчику языка ВУ, в рамках конкретно этой задачи это не нужно.

В результате вывод будет, что динамические массивы в делфи создавать нельзя, т.к. любая инструкция в цикле вида
Delphi
1
SetLengTh(mass1, LengTh(mass1)+1);
при больших количествах повторений вызовет создание побочных массивов в памяти и приведёт к ошибке out of memory?
0
10 / 10 / 4
Регистрация: 14.01.2010
Сообщений: 80
30.11.2014, 15:45
что при больших объемах перераспределяемой памяти под массив (как имеется у ТС) очень даже вызовет дефрагментацию
во первых не дефрагментацию, а фрагментацию
во вторых out of memory это может вызвать, если масив размером примерно 1 Гб тогда перенести его может быть проблематично для х32 приложения. ТС же говорит о файле в каких-то 10 мб.

3) сказал - увеличь размер на единицу, если я буду вставлять что-то новое в массив
А делфи мне насоздавала кучу непонятных массивов в памяти и вконце выдала ошибку?
Ничего он тебе не создавал, не забивай голову ерундой, выложи весть проект. Приведенный тобой код не компилируется, елси даже повозиться и накидать на форму нужные юниты, едиты и т.д.

Вот например такая строка:
Result := Copy(Where, Pos1 Length(First), Pos2 - Pos1 - Length(First));
явно тен знака + ил - после Pos1, не компилируется в общем приведенный тобой код.
0
Пишу на Delphi...иногда
 Аватар для cotseec
1423 / 1278 / 286
Регистрация: 03.12.2012
Сообщений: 3,914
Записей в блоге: 5
30.11.2014, 15:55
Цитата Сообщение от ISerg1986 Посмотреть сообщение
при больших количествах повторений вызовет создание побочных массивов в памяти
такого не будет, "побочные" массивы не создаются, память выделяется "друг за другом" для всех задействованных переменных, при увеличении размера массива память для него выделяется уже после всех переменных, пока происходит работа с ним выделяется еще память под переменные и т.д. - возникает фрагментация памяти, а т.к. менеджер памяти Delphi забирает память под нужды программы большими порциями, то при сравнительно маленьких объемах массивов это не очень заметно
могу ошибаться, но есть директива компилятора (или есть в настройках среды) указывающая какой объем памяти брать единоразово
Цитата Сообщение от ISerg1986 Посмотреть сообщение
приведёт к ошибке out of memory?
а вот это вполне очень возможно, свидетелем чего и стали
Цитата Сообщение от ISerg1986 Посмотреть сообщение
В результате вывод будет, что динамические массивы в делфи создавать нельзя,
очень даже можно, но при их создании следует учитывать объем и частоту перераспределения данных, как в вашем случае, иногда стоит попытаться изменить алгоритм

Цитата Сообщение от ISerg1986 Посмотреть сообщение
Разработчику не важно, что и как будет делать компилятор, среда разработки, встроенные функции.
очень даже важно, в некоторых случаях незнание/непонимание этого приводит к непонятным ошибкам, незнание своего инструмента и пренебрежение им, имхо, при всем уважении есть признак дилетантства

успехов
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.11.2014, 15:55
Помогаю со студенческими работами здесь

Ошибка: Out of memory на Delphi XE3
Добрый день, при разработке программ время от времени появляется ошибка Out of memory, причем в исходный код изменений может быть даже не...

Ошибка 'Out of memory'. График двух функций
Быдло кодер то есть я, написал кривой код в следствии чего, компилятор выдаёт ошибку 'Out of memory'. Собственно сам код unit Unit1; ...

Ошибка Out of memory при загрузке файла в TStringList
Добрый день. Есть следующая ситуация РС(i7 8Gb Win7 x64 + RAD XE3), приложения можно компилировать только в 32 разр. режиме - список...

Ошибка [dcc32 Fatal Error] Unit10.pas(7): F2046 Out of memory
Возникла такая ошибка первый раз. Я написал программный код, начинаю компилировать, он мне выдает: Unit10.pas(7): F2046 Out of...

Ошибка Out of memory при проверке наличия строки S в тексте TStringList
Программа проверяет наличие строки S в тексте TStringList, происходит это около 2000 раз и вылетает ошибка &quot;Out of memory&quot; на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Данные берутся из. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru