Matlab не может прочитать указанное количество элементов из файла.У меня есть простая программа, которая должна прочитать два файла, выполнить линейную операцию с данными и записать объединенный результат в третий файл.
Мои вопросы: 1) Почему Matlab не может прочитать указанныйколичество элементов и 2) есть ли обходной путь для этого? Любые ваших мыслей будут полезны.
Некоторые детали входных файлов:
- они большие (~ 18 ГБ)
- ониимеют одинаковый размер (точно)
Подробности процедуры (2-4 обусловлены проверкой feof
обоих файлов:
- Откройте вход ивыходные файлы для чтения и записи (соответственно)
- Чтение
N
float (N * 4 байта) из каждого из входных файлов - Выполнение операции над данными (скажем, 0,5 *(datin1 + datin2))
- Запишите результат в выходной файл.
Конечно, это все очень просто, и в большинстве случаев в прошлом это работало хорошо. К сожалению,в какой-то момент цикла MATLAB не получает все N
чисел с плавающей точкой из одного из файлов и выдает ошибку измерения матрицы на шаге 3.
КОД SNIP:
N = 2048;
fidin1 = fopen('file1.dat','r','l');
fidin2 = fopen('file2.dat','r','l');
fidout = fopen('outfile.dat','w','l');
%# I could do some assertions on the file sizes,
%# but I know they are the same size (w/o question).
while(~feof(fidin1) && ~feof(fidin2))
datin1 = fread(fidin1,N,'float=>single',0,'l');
datin2 = fread(fidin2,N,'float=>single',0,'l');
%# the following line produces an error after 100
%# or more iterations in to the procedure
datout = 0.5*(datin1+datin2);
fwrite(fidout,datout,'float',0,'l');
end
ОБНОВЛЕНИЕ 1 Я получаю сообщение об ошибке:
???Error using ==> plus
Matrix dimension must agree.
ОБНОВЛЕНИЕ 2 Я последовал предложению и включил ferror
проверяет после каждого чтения и магически проблема исчезла. Итак, теперь модификация моих вопросов : Что может быть причиной проблемы здесь?Это просто проблема синхронизации или ошибка?
Вот фрагмент обновленного кода (показывающий только часть кода).Я уверен, что есть лучшие способы сделать это.Несмотря на это, добавление этих проверок позволило Matlab успешно завершить все операции чтения из каждого из файлов.
[datin1 count1]= fread(fidin1,N,'float=>single',0,'l');
[msg errn1]=ferror(fidin1);
if errn1
pos1 = ftell(fidin1);
error('Error at Position %d in file. %d bytes were read.',...
pos1,count1);
end
[datin2 count2]= fread(fidin2,N,'float=>single',0,'l');
[msg errn2]=ferror(fidin2);
if errn2
pos2 = ftell(fidin2);
error('Error at Position %d in file. %d bytes were read.',...
pos2,count2);
end
%# the following line produces an error after 100
%# or more iterations in to the procedure
datout = 0.5*(datin1+datin2);
fwrite(fidout,datout,'float',0,'l');