![]() |
|
|
#1
|
|||
|
|||
|
Есть два файла по 400 млн. значений,пытаюсь загрузить их в два динамических массива но при нажатии кнопки загрузка вылетает эта ошибка Range Check Error. Может что то с памятью надо делать?
Код:
procedure LoadData(fn:string);
begin
AssignFile(f,fn);//Подключаем файл
Reset(f);//Открываем файл
SetLength(data,count);//Задаём размер массива data
d:=round(count/100);//Задаём шаг
a:=d;
Form1.Label5.Caption:='Please,wait';
Form1.Gauge1.Progress:=0;//Обнуляем Gauge1
Form1.Gauge1.Show;//Показываем Gauge1
for i:=1 to count do//Цикл считывания строк из файла
begin
CheckAbort;//Проверяем нажатие кнопки закрытия программы
Readln(f,buf);//Считываем строку из файла и помещаем в buf
if i=a then//Условие обновления Gauge1
begin
Form1.Gauge1.Progress:=Form1.Gauge1.Progress+1;
a:=a+d;//Задаём значение проверки для следующего обновления Gauge1
end;
ps:=pos('.',buf);//Ищем в строке buf символ '.' и сохраняем позицию в ps
if ps=0 then//Условие проверки числа; если '.' нет, то выполняем
begin
buf:=buf+',0';//добавляем к числу ',0'
end
else//Заменяем '.' на ','
begin
num:=copy(buf,1,ps-1);//Сохраняем символы из buf в num до точки
num:=num+',';//Добавляем к num символ ','
num:=num+copy(buf,ps+1,length(buf)-ps);//Сохраняем символы из buf в num после точки
end;
data[i-1]:=StrToFloat(num);//Конвертируем из строки в число и сохраняем в массив
end;
CloseFile(f);
Form1.Gauge1.Hide;//Прячем Gauge1MAD: Для оформления кода используем тег code а не quote Последний раз редактировалось M.A.D.M.A.N., 25.02.2013 в 22:21. |
|
#2
|
||||
|
||||
|
Не понятно, какие типы переменных используются. Может в них косяк быть (ошибка 201).
З.Ы. Проверил, у меня данный код работает, происходит заполнение массива числовыми данными (типа -0.720767676830292) из небольшого текстового файла. Последний раз редактировалось Alegun, 26.02.2013 в 01:48. Причина: Дополнение |
|
#3
|
|||
|
|||
|
Ну да, насчёт типов.
Если data:array of double; то 400 миллионов - это больше трёх гигабайт, на win32 может не прокатить. |
|
#4
|
|||
|
|||
|
а какой тип тогда использовать
|
|
#5
|
||||
|
||||
|
Не советую такие объемы данных сразу в память грузить. Читай по кускам, обрабатывай по кускам.
|
|
#6
|
|||
|
|||
|
а есть пример как по кускам такое кол-во обрабатывать
|
|
#7
|
||||
|
||||
|
Зависит от того, какая нужна обработка.
|
|
#8
|
|||
|
|||
|
необходимо работать с этими 400 млн значениями,искать максиумы и миинимумы и строить графики отдельных участков
|
|
#9
|
||||
|
||||
|
Искать максимум и минимум можно без прочтения всего в память. После прочтения очередного значения проверить его, не является ли оно текущим максимумом (больше предыдущего максимума).
Строить графики по частям - ну опять же, их-то надо строить по частям, читаешь часть и рисуешь по ней график. |