Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.12.25;
Скачать: CL | DM;

Вниз

Большие массивы   Найти похожие ветки 

 
Sung   (2005-12-07 09:42) [0]

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


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

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


 
evvcom ©   (2005-12-07 10:20) [2]

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


 
umbra ©   (2005-12-07 10:20) [3]

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

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


 
evvcom ©   (2005-12-07 10:27) [4]


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

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


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

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


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

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


 
umbra ©   (2005-12-07 11:36) [7]


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

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


 
Sung   (2005-12-07 12:12) [8]

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

 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;


 
Sergey13 ©   (2005-12-07 12:29) [9]

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


 
alex_*** ©   (2005-12-07 12:37) [10]

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


 
Sung   (2005-12-07 12:40) [11]

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


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

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


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

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


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

SetLength(Arr, N+1);

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



Страницы: 1 вся ветка

Текущий архив: 2005.12.25;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.058 c
2-1133884135
VitGun
2005-12-06 18:48
2005.12.25
QuickReport. Печать текущей записи.


1-1133454512
Aleksandr.
2005-12-01 19:28
2005.12.25
Как можно узнать, поддерживает ли Excel задаваемый цвет?


6-1126863529
nokk
2005-09-16 13:38
2005.12.25
IP адрес


1-1133334608
kot1110
2005-11-30 10:10
2005.12.25
Unit тесты


5-1118656499
Subdigger
2005-06-13 13:54
2005.12.25
TDataset