fprintf Octave - повреждение данных
Я пытаюсь записать данные в файлы.txt. Каждый из файлов составляет около 170 МБ (после записи данных в него).
Я использую функцию fprintf в octave с "%.8f" для записи значений с плавающей запятой в файл. Однако я заметил очень странную ошибку, заключающуюся в том, что подмножество записей в некоторых файлах повреждено. Например, одна из строк в файле:
0.43529412,0.} 4313725,0.43137255,0.33233533,...
что "}" должно было быть "4". Теперь, как fprintf из octave написал "}" с опцией "%.8f"? Что не так?
Другой пример,
0,73289\8B987,...
как это "\8B" попало туда?
Я должен обработать очень большой набор данных с общим количеством точек 360 миллионов. Эта ошибка в подмножестве строк в некоторых файлах становится большой проблемой. Что вызывает эту проблему?
Кроме того, эта коррупция не происходит случайно. Например, если файл имеет 1,1 миллиона строк, где каждая строка соответствует вектору, представляющему экземпляр данных, то возникает проблема, скажем, максимум в 100 строк, и эти 100 строк объединяются в кластер. Скажем, например, они распределяются от строки 8000 до 8150, но это не тот случай, когда из 100 поврежденных рядов первые 50 расположены около, скажем, 10000-го ряда, а остальные - в, скажем, 20000-м ряду. Они всегда образуют кластер.
Примечание. Ниже приведен кодовый блок, отвечающий за извлечение данных и их запись в файлы. Некоторые переменные в коде, такие как K_Cell, были вычислены ранее и практически не играют роли в процессе записи данных.
mf = fspecial('gaussian',[5 5], 2);
fidM = fopen('14_01_2016_Go_AeossRight_ClustersM_wLAMRD.txt','w');
fidC = fopen('14_01_2016_Go_AeossRight_ClustersC_wLAMRD.txt','w');
fidW = fopen('14_01_2016_Go_AeossRight_ClustersW_wLAMRD.txt','w');
kIdx = 1;
featMat = [];
% - Generate file names to print the data to
featNo = 0;
fileNo = 1;
filePath = 'wLRD10_Data_Road/featMat_';
fileName = [filePath num2str(fileNo) '.txt'];
fidFeat = fopen(fileName, 'w');
% - Compute the global means and standard deviations
gMean = zeros(1,13); % - Global mean
gStds = zeros(1,13); % - Global variance
gNpts = 0; % - Total number of data points
fidStat = fopen('wLRD10_Data_Road/featStat.txt','w');
for i=1600:10:10000
if (featNo > 1000000)
% - If more than 1m points, close the file and open new one
fclose(fidFeat);
% - Get the new file name
fileNo = fileNo + 1;
fileName = [filePath num2str(fileNo) '.txt'];
fidFeat = fopen(fileName, 'w');
featNo = 0;
end
imgName = [fAddr num2str(i-1) '.jpg'];
img = imread(imgName);
Ir = im2double(img(:,:,1));
Ig = im2double(img(:,:,2));
Ib = im2double(img(:,:,3));
imgR = filter2(mf, Ir);
imgG = filter2(mf, Ig);
imgB = filter2(mf, Ib);
I = im2double(img);
I(:,:,1) = imgR;
I(:,:,2) = imgG;
I(:,:,3) = imgB;
I = im2uint8(I);
[Feat1, Feat2] = funcFeatures1(I);
[Feat3, Feat4] = funcFeatures2(I);
[Feat5, Feat6, Feat7] = funcFeatures3(I);
[Feat8, Feat9, Feat10] = funcFeatures4(I);
ids = K_Cell{kIdx};
pixVec = zeros(length(ids),13); % - Get the local image features
for s = 1:length(ids) % - Extract features
pixVec(s,:) = [Ir(ids(s,1),ids(s,2)) Ig(ids(s,1),ids(s,2)) Ib(ids(s,1),ids(s,2)) Feat1(ids(s,1),ids(s,2)) Feat2(ids(s,1),ids(s,2)) Feat3(ids(s,1),ids(s,2)) Feat4(ids(s,1),ids(s,2)) ...
Feat5(ids(s,1),ids(s,2)) Feat6(ids(s,1),ids(s,2)) Feat7(ids(s,1),ids(s,2)) Feat8(ids(s,1),ids(s,2))/100 Feat9(ids(s,1),ids(s,2))/500 Feat10(ids(s,1),ids(s,2))/200];
end
kIdx = kIdx + 1;
for s=1:length(ids)
featNo = featNo + 1;
fprintf(fidFeat,'%d,%.8f,%.8f,%.8f,%.8f,%.8f,%.8f,%.8f,%.8f,%.8f,%.8f,%.8f,%.8f,%.8f\n', featNo, pixVec(s,:));
end
% - Compute the mean and variances
for s = 1:length(ids)
gNpts = gNpts + 1;
delta = pixVec(s,:) - gMean;
gMean = gMean + delta./gNpts;
gStds = gStds*(gNpts-1)/gNpts + delta.*(pixVec(s,:) - gMean)/gNpts;
end
end
Обратите внимание, что блок кода:
for s=1:length(ids)
featNo = featNo + 1;
fprintf(fidFeat,'%d,%.8f,%.8f,%.8f,%.8f,%.8f,%.8f,%.8f,%.8f,%.8f,%.8f,%.8f,%.8f,%.8f\n', featNo, pixVec(s,:));
end
это единственная часть кода, которая записывает точки данных в файлы.
Чем раньше код-блок,
if (featNo > 1000000)
% - If more than 1m points, close the file and open new one
fclose(fidFeat);
% - Get the new file name
fileNo = fileNo + 1;
fileName = [filePath num2str(fileNo) '.txt'];
fidFeat = fopen(fileName, 'w');
featNo = 0;
end
открывает новый файл для записи данных в него, когда текущий открытый файл превышает ограничение в 1 миллион точек данных.
Кроме того, обратите внимание, что
pixVec
переменная не может содержать ничего, кроме значений с плавающей запятой / двойного, иначе октава выдаст ошибку.