|
16 / 16 / 13
Регистрация: 12.01.2014
Сообщений: 177
|
|
Ошибка out of memory27.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
|
|
| 27.11.2014, 16:30 | |
|
Ответы с готовыми решениями:
21
Ошибка Out of memory
Ошибка out of memory |
|
73 / 74 / 23
Регистрация: 14.10.2013
Сообщений: 549
|
|
| 27.11.2014, 16:54 | |
|
Очень много там у тебя кода. Но точно могу сказать, что ты не освобождаешь память от ненужных тебе объектов.
0
|
|
|
16 / 16 / 13
Регистрация: 12.01.2014
Сообщений: 177
|
|||||||
| 27.11.2014, 18:08 [ТС] | |||||||
|
И освобождать память от чего? Переменные перезаписываются. Массивы, как только объединил два в третий (новый) - то сразу эти два прибил.
Добавлено через 5 минут Можно конечно, оптимизировать код - заменить кое что, убрать пару переменных - но смысл? Они роли не играют, как я думаю. Хотя, чтобы уменьшить код - я сделаю это. Программа то в принципе такая ------------------- Поток Цикл1-Конец цикла1 Массив1 Цикл2-Конец цикла2 Массив2 Цикл3-Конец цикла3 Массив3=объединение Массива1 и Массива2 Уничтожаем Массив1 и Массив2 Цикл4 - работа с массивом 3-Конец цикла4 Результат массив 4 Вывод массива 4 в файл Конец потока ------------------------- Сплошные циклы и массивы. Больше ничего и нет. Добавлено через 6 минут И ещё хотел спросить - может есть какой-то инструмент, который позволит мне поймать эту ошибку? Понять, что происходит.
0
|
|||||||
|
13116 / 5897 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
|
||||||
| 28.11.2014, 09:16 | ||||||
|
ISerg1986, в программе экземпляры TMyThread (TThread) не уничтожаются и остаются в памяти. Чтобы экземпляр TThread автоматически уничтожился при завершении метода Execute(), надо задать свойство:
MyThread.FreeOnTerminate := True; Этот код можно добавить прямо в самое начало тела метода MyThread.Execute():
0
|
||||||
|
16 / 16 / 13
Регистрация: 12.01.2014
Сообщений: 177
|
|||||||
| 28.11.2014, 19:17 [ТС] | |||||||
|
В результате долгого поиска, нашел ошибку. И это странно. А именно - ошибка в задании величины массива. Я задавал массивы размером 1 и в случае вставки нового элемента, увеличивал размер массива на 1. Логично? И с файлами до 2МБ всё работало. С файлами большего размера - вылетала ошибка. Что странно. Я задал массив побольше - 1000000 строк и всё заработало. Но это не есть гуд. Не логично. Массив то динамический.
0
|
|||||||
|
пофигист широкого профиля
4770 / 3205 / 862
Регистрация: 15.07.2013
Сообщений: 18,613
|
||
| 28.11.2014, 19:25 | ||
|
0
|
||
|
16 / 16 / 13
Регистрация: 12.01.2014
Сообщений: 177
|
|||||||
| 28.11.2014, 19:59 [ТС] | |||||||
).Далее в цикле идёт увеличение его размера.
Например файл 1.5 МБ - около 70.000 строк программа обрабатывала нормально.
0
|
|||||||
|
пофигист широкого профиля
4770 / 3205 / 862
Регистрация: 15.07.2013
Сообщений: 18,613
|
||
| 28.11.2014, 21:26 | ||
|
0
|
||
|
16 / 16 / 13
Регистрация: 12.01.2014
Сообщений: 177
|
|||||||
| 29.11.2014, 12:04 [ТС] | |||||||
|
Что плохого, что я выделяю новый блок памяти (ячейку) для следующего значения массива? Я увеличиваю массив - его размер. Или вы хотите сказать, что этим кодом
А куча старых массивов остаётся в памяти? Это странно... Я же задал только один массив (в var) и далее работаю с его размером. Установлю размер 10 и уничтожу все элементы массива, кроме первых 10. А если 0 то "уничтожу" массив.
0
|
|||||||
|
пофигист широкого профиля
4770 / 3205 / 862
Регистрация: 15.07.2013
Сообщений: 18,613
|
|
| 29.11.2014, 14:15 | |
|
0
|
|
|
16 / 16 / 13
Регистрация: 12.01.2014
Сообщений: 177
|
||
| 29.11.2014, 18:20 [ТС] | ||
|
Я же сказал программе не создавать новый массив, а увеличить размер существующего массива. И как она это сделает - создаст новый, перезапишет старый и т.д. мне всё равно. А 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 | ||
|
0
|
||
|
10 / 10 / 4
Регистрация: 14.01.2010
Сообщений: 80
|
|||||||
| 29.11.2014, 23:04 | |||||||
|
Это можно легко проверить следующим кодом:
0
|
|||||||
|
пофигист широкого профиля
4770 / 3205 / 862
Регистрация: 15.07.2013
Сообщений: 18,613
|
||
| 30.11.2014, 03:15 | ||
|
Добавлено через 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...иногда
|
||||
| 30.11.2014, 13:37 | ||||
|
Плохие указатели
0
|
||||
|
16 / 16 / 13
Регистрация: 12.01.2014
Сообщений: 177
|
||||||
| 30.11.2014, 14:11 [ТС] | ||||||
|
Я не очень понял.
Почему я 1) указал делфи тип массива 2) указал делфи размер массива - единица 3) сказал - увеличь размер на единицу, если я буду вставлять что-то новое в массив А делфи мне насоздавала кучу непонятных массивов в памяти и вконце выдала ошибку? Это не логично. Инструкции были чёткие и однозначные. Разработчику не важно, что и как будет делать компилятор, среда разработки, встроенные функции. Это их задачи и задачи разработчиков языка. Это в каком то смысле инкапсуляция. Мне кажется, что это ошибка делфи (языка паскаль). Я понимаю, что есть дефрагментация памяти, распределение памяти в массивах элементов различных типов и т.д., но разработчику языка ВУ, в рамках конкретно этой задачи это не нужно. В результате вывод будет, что динамические массивы в делфи создавать нельзя, т.к. любая инструкция в цикле вида
0
|
||||||
|
10 / 10 / 4
Регистрация: 14.01.2010
Сообщений: 80
|
|||
| 30.11.2014, 15:45 | |||
во вторых out of memory это может вызвать, если масив размером примерно 1 Гб тогда перенести его может быть проблематично для х32 приложения. ТС же говорит о файле в каких-то 10 мб.
Вот например такая строка: Result := Copy(Where, Pos1 Length(First), Pos2 - Pos1 - Length(First)); явно тен знака + ил - после Pos1, не компилируется в общем приведенный тобой код.
0
|
|||
|
Пишу на Delphi...иногда
|
|||||
| 30.11.2014, 15:55 | |||||
|
могу ошибаться, но есть директива компилятора (или есть в настройках среды) указывающая какой объем памяти брать единоразово успехов
0
|
|||||
| 30.11.2014, 15:55 | |
|
Помогаю со студенческими работами здесь
20
Ошибка 'Out of memory'. График двух функций Ошибка Out of memory при загрузке файла в TStringList
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Отправка уведомления на почту при изменении наименования справочника
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
|