Почему MATLAB не может успешно прочитать двоичные файлы?

Matlab не может прочитать указанное количество элементов из файла. У меня есть простая программа, которая должна читать в двух файлах, выполнять линейную операцию с данными и записывать объединенный результат в третий файл.

Мои вопросы: 1) Почему Matlab не может прочитать указанное количество элементов и 2) есть ли обходной путь для этого? Любые ваши мысли будут полезны.

Некоторые сведения о входных файлах:

  • они большие (~ 18 ГБ)
  • они оба одинакового размера (точно)

Подробнее в процедуре (2-4 обусловлены проверкой feof обоих файлов:

  1. Открытие входных и выходных файлов для чтения и записи (соответственно)
  2. Прочитать N с плавающей точкой (N * 4 байта) из каждого входного файла
  3. Выполнение операции с данными (скажем, 0,5 * (datin1 + datin2))
  4. Записывает результат в выходной файл.

Конечно, это все очень просто, и в большинстве случаев в прошлом это работало хорошо. К сожалению, в какой-то момент цикла MATLAB не получает все N float из одного из файлов и дает размерность матрицы ошибка на шаге 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');
7
задан ephsmith 10 August 2011 в 17:43
поделиться