Сбой Octave из-за очистки переменных в скрипте без точек останова - Попытки записи в последний блок памяти - PullRequest
0 голосов
/ 12 июня 2018

В моей системе (Windows, 8 ГБ ОЗУ, 64-разрядная версия i7) у Octave есть проблема с обработкой массивов среднего размера.У меня открыт диспетчер задач, и память никогда не выходит за пределы 200 МБ до графического раздела.Часто происходит сбой около 150 МБ.Интересно то, что если я добавлю точки останова в свой код, чтобы найти, где проблема, проблема исчезнет, ​​и я на самом деле смогу пройти через все и перейти к графической части.Это также приводит к сбою, если я не добавлю точки останова на каждый другой график.

С помощью точек останова я могу загрузить его до полной загрузки сценария, которая должна составлять около 1 ГБ.Я не сумасшедший, верно?Предполагается, что это будет простой материал, через который Matlab будет проходить за секунду.

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

n2040id = fopen(n_20to40ft_file);
n2040data = dlmread(n2040id,',', [8 1 70849 98]);
fclose(n2040id);
n20test = n2040data(3410:22066,:);
n30test = n2040data(26730:45748,:);
n40test = n2040data(49874:68706,:);
clear n2040data;

%% 20Ft Test Processing
n20spo2 = n20test(:,88);
n20spo2(n20spo2 == 0) = [];
n20co = n20test(:,89);
n20co(n20co == 0) = [];
clear n20test;

%% 30 Ft Test Processing
n30spo2 = n30test(:,88);
n30spo2(n30spo2 == 0) = [];
n30co = n30test(:,89);
n30co(n30co == 0) = [];
clear n30test;

%% 40 Ft Test Processing
n40spo2 = n40test(:,88);
n40spo2(n40spo2 == 0) = [];
n40co = n40test(:,89);
n40co(n40co == 0) = [];
clear n40test;

Этот фрагмент использует около 60-90 МБ памяти по сравнению с памятью до этой точки, которая очищается перед каждым перерывом, когда я заканчиваю с ним.Первый массив имеет двойной размер 70841x98, а остальные становятся размером от 450x1 до 900x1.Это несложные массивы, чтобы иметь дело с длинным выстрелом.Тем не менее, он не будет работать, если я не введу эти точки останова, тогда я могу просто нажать продолжить, и это нормально.

Я также пытался использовать clear -v, но это тоже сбой, если я не использовал точки останова.

Теперь я отладил в Visual Studio и получил эту ошибку: No symbol file loaded for liboctgui-3.dll, а также и ошибку, что он пытался получить доступ к 0xFFFFFFFFFFFFFFFF, и получил «отказано в разрешении», пытаясь получить к нему доступ.С какой стати он пытается получить доступ к последнему блоку памяти?

На самом деле этого не происходит, если я не очищаю переменные.К счастью, это займет 1 -1,4 ГБ.Это известная проблема?освобождение памяти не должно вызывать попытки программы получить доступ к самому последнему, возможно, блоку памяти.

...