Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Большие массивы


Sung ©   (2005-12-07 09:42:00) 

Коротко о проблеме. Есть программа, которая собирает информацию, заносит в динамические массивы, обрабатывает ее и выдает результат.
Проблема в том, что иногда информации так много, что не хватает памяти. Если подскажете, как можно решить эту проблему, буду очень благодарен. :)


Sapersky   (2005-12-07 14:24:00) [1]

SetLength(Arr, N+1);

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


alex_***   (2005-12-07 13:03:00) [2]

а толку тогда от этой упрощенной схемы. Все равно не видно что происходит. Тогда на БД переделывай


Sung   (2005-12-07 12:42:00) [3]

Поодиночке файлы тоже нельзя. Поэтому память освободить не удается.


Sung   (2005-12-07 12:40:00) [4]

alex, я написал упрощенную схему. На самом деле у меня более сложные типы, всевозможные проверки и т.д.
Перебираю я не все строки, конечно. MaxRow содержит не 65k, у самую нижнюю строку, в которой было изменение.


alex_***   (2005-12-07 12:37:00) [5]

пиши данные в Access, обрабатывай там и выкидывай в другой excel.
Все строки ты смотришь - это 65k перебираешь? Лихо. Может хотя бы смотреть что подряд встретилось x пустых строк, то дальше не смотреть?
Поодиночке файлы нельзя обрабатывать?


Sergey13   (2005-12-07 12:29:00) [6]

2[6] Sung   (07.12.05 11:16)
>Про БД. Совет хороший. Я тоже об этом думал. Но придется переписывать весь код.
Наверное настала пора думать более предметно и начинать, подумавши, потихоньку переписывать


Sung   (2005-12-07 12:12:00) [7]

Упрощенно алгоритм выглядит следующим образом

 var
   i, j, N: Integer;
   Arr: array of Integer;    
....
 N:=0;
 for i:=1 to Count do//Количество файлов
 begin
   Flex.OpenFile(ExcelFile[i]); //открыть файл Excel
   for j:=1 to Flex.MaxRow do //Смотрим все строки в файле Excel
   begin
      inc(N);
      SetLength(Arr, N+1);
      Arr[N]:=Flex.CellValue[j,1];
   end;
   Flex.CloseFile;
 end;


umbra   (2005-12-07 11:36:00) [8]


> Согласен, кривой. Поэтому и спрашиваю у вас совета, как
> поменять его малой кровью.

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


Sung   (2005-12-07 11:16:00) [9]

Чуть подробнее о программе. Есть множество файлов Excel. Программа через компонент FlexCel считывает данные из этих файлов в динамические массивы, сортирует, выполняет определенные вычисления, и результат заносит в другие файлы Excel.
Это программу писал я относительно давно. В последнее время данных стало гораздо больше. Поэтому программа уже не справляется. Ошибка возникает в момент выделения памяти под динамический массив.
Советы, связанные с добавлением памяти и переустановкой системы, в моей ситуации неосуществимы. Программа стоит на нескольких машинах.
По поводу алгоритма. Согласен, кривой. Поэтому и спрашиваю у вас совета, как поменять его малой кровью.
Про БД. Совет хороший. Я тоже об этом думал. Но придется переписывать весь код.
Про сохранение на диск. Можно подробнее? Есть ли какие-то механизмы автоматического сохранения информации при нехватке памяти и извлечения в случае необходимости?


Anatoly Podgoretsky   (2005-12-07 10:58:00) [10]

Sung   (07.12.05 09:42)  
Вероятно памяти более чем достаточно, просто ты с ней наплевательски работаешь. Меняй алгоритмы.


evvcom   (2005-12-07 10:27:00) [11]


> 1) Добавить памяти на комптьютер.

Вероятно, что этого будет недостаточно. Надо будет еще сменить ОС на ту, у которой ограничение на 2 (3, 4) ГБ на приложение снято.


Sergey13   (2005-12-07 10:20:00) [12]

>Есть программа, которая собирает информацию
Откуда?
Может БД прикрутить?


evvcom   (2005-12-07 10:20:00) [13]

А что можно подсказать, если о задаче ни слова. Ну скидывай обработанную информацию в файлы на диск. Та же винда и та использует файл подкачки. Word при открытии даже самого маленького файлика создает на диске временный файл.


umbra   (2005-12-07 10:20:00) [14]

Есть два способа:

1) Добавить памяти на комптьютер.
2) Периодически освобождать память, выделенную программе.


Наверх

Титульная страница Поиск, карта сайта Написать письмо