Почему MATLAB не может успешно читать в двоичных файлах? - PullRequest
7 голосов
/ 10 августа 2011

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

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

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

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

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

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

Конечно, это все очень просто, и в большинстве случаев в прошлом это работало хорошо. К сожалению,в какой-то момент цикла 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');

1 Ответ

1 голос
/ 03 ноября 2011

Вы обращали особое внимание на переменные datin1 и datin2 в момент возникновения ошибки? Попробуйте перейти к «Debug -> Stop if Errors / Warnings ...», затем выберите «Всегда останавливать, если ошибка (dstop if error)». Запустите вашу программу, а затем, когда она выйдет из строя, посмотрите на datin1 и datin2. Надеюсь, это объяснит, почему их объединение теперь работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...