delphi out of memory

Я имею один проект Delphi XE2 для обработки большого количества вычислений.
В моем проекте я имею всего 1290 номеров из Edit 340 чисел Label , 330 чисел Panel , 16 числа TabSheet . Для каждого Edit , есть OnChange , OnDblClick , OnEnter и OnExit событие.

Я должен обрабатывать всего 1034 номеров из Variable . Я только проектировал Form и не добавил эти вычисления логики. Теперь мои .pas file становятся 62.5MB имеющим 1815057 Линии и .dfm file становятся 1.98 MB имеющей 65540 линий .

Я пытаюсь скомпилировать проект , используя Delphi XE2 под Windows XP Professional SP3 32Bit , но я получаю сообщение об ошибке , как **[DCC Fatal Error] Unit1.pas(1815058): F2046 Out of memory** .

Кроме того, я пытался скомпилировать его с помощью Delphi XE5 Under Windows 8 Enterprise 64Bit , здесь тоже, я получаю ту же проблему.

Я не добавил полную логику вычисления с использованием 1034 номеров переменных, если добавить их, по крайней мере , 4200 Линии будут добавлены к .pas file .

Весь ваш подход является ошибочным. Компилятор просто не может обрабатывать размер файла, который вы представить его. Паскаля исходный файл 1800000 линии смешно. Файл 2MB .dfm непрактично.

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

Решение не расширить все варианты во время компиляции. Решение состоит в том, чтобы написать заявление, чтобы он мог представить различные варианты во время выполнения. Так, где у вас есть 30 различных переменных, вы, вероятно, создали 30 различных элементов управления этикеток, а также 30 различных редактирования элементов управления. Правильный подход заключается в создании одной этикетки и один элемент управления редактирования. Затем во время выполнения, в зависимости от опции пользователя, изменить заголовок метки, и содержание редактирования.

Не создавайте одну переменную для каждого возможного значения, что вам нужно для хранения. Используйте массивы и словари или.

На высоком уровне, вы должны взять на себя логику, которая содержится в вашем шаге предварительной обработки Excel и преобразовать его в запуске временного кода Delphi.

Здравствуйте прошу помочь адаптировать свой скрипт вот так: клац

Или помочь решить как то это другим образом , вот сам скрипт.

1 ответ 1

Ошибка нехватки памяти резонно возникает при попытке загрузить в память файл размером в 20Гигабайт. Для решения задачи вы можете читать файл построчно. Для этого могут быть выбраны различные варианты, самым простым из которых является использование старых добрых функций readln() . У этого подхода, есть свои минусы в т.ч. в скорости работы, и если вы готовы использовать сторонние библиотеки для потокового чтения, то лучше подумать об их применении.
Вопрос о рассмотрении эффективности чтения больших файлов, в частности в старенькой Delphi-7 , лучше вынести в отдельный вопрос.

В целом принцип останется неизменным, с помощью того или иного способа вы будете читать файл по строкам до конца, и затем искать в них совпадения. В своем коде у вас также внешний цикл поиска — это цикл по строкам Memo, что влечет за собой чтение файла N-раз, но поскольку вы вряд ли хотите читать 20Гб-файл несколько раз, то внешний цикл должен быть по файлу. А внутри уже поиск подстрок в каждой строке.

Отмечу, что при таком подходе при достаточно большом числе совпадений строк в файле вы все равно можете получить OutOfMemory Exception , переполнив TMemo с результатами совпадений.
Возможно, имеет смысл также увеличить буфер чтения для файла до больших размеров, выделив память динамически.

You get this error when the RAD Studio built-in compiler runs out of memory.

This is a rare error that might occur when you build an extremely large project group of applications and libraries.

To solve this issue, do any of the following:

  • Make sure your swap file is large enough and that there is still room on your disk. See Change the size of virtual memory.
  • Configure your project group to be built externally to the >Project > Options >Delphi Compiler and check the Use MSBuild externally to compile property. Note: If you want to be able to debug your app when you build with this option set, the Include remote debug symbols option should also be enabled on Project > Options > Delphi Compiler >Linking .
  • Build your project group on the command line.
  • Refactor the applications and libraries in your project group to rely more on Delphi packages. Delphi packages do not make the IDE run out of memory.
Оцените статью