Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2005.12.25;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.012 c
14-1133636713
Юзверюга
2005-12-03 22:05
2005.12.25
А это что за клон?


2-1133957542
Aleks
2005-12-07 15:12
2005.12.25
Как узнать существует папка или нет??


2-1134157679
MAXHO
2005-12-09 22:47
2005.12.25
Как получить такой эфект?


2-1133759989
Gem
2005-12-05 08:19
2005.12.25
Определение реального текущего номера записи таблицы


2-1133880218
seleman
2005-12-06 17:43
2005.12.25
Вопрос по сокетам





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский