Запись большого количества текстовых файлов (90), 5 МБ на файл, занимает до 1400 с

Я студент в области электротехники.

В качестве задания мне нужно реализовать алгоритм обратной проекции, используемый в медицинской визуализации для формирования изображения.
Для расчета конечного изображения много информации рассчитывается и сохраняется в векторе.
При определенном желаемом разрешении (256 * 256 пикселей) конечного изображения программа вылетает, когда у меня заканчивается ОЗУ, поэтому я решил записать эту информацию в 90 текстовых файлов.

Я использую ofstream, чтобы написать эти файлы.

Время, необходимое для вычисления этой информации и последующего ее сохранения в векторе:

  • выходное разрешение 64×64: 13,4 с
  • выходное разрешение 128×128: 140 с

Запись этой информации в файлы .txt:

  • 64×64 156 с (1,25 МБ / файл)
  • 128×128 1400 с (5 МБ / файл)

Запись кода в файлы:

ofstream file;
for(k = 0; k < 90; k++)
{
oss.str(""); //string stream
oss << "rec\\reconstruction_matrix_step"<< k << ".txt" ; // per step other file
filename = path;
filename.append(oss.str());
file.open(filename.c_str());
double weight;
for( l = 0; l < resolution; l ++)
{

bestand << "Begin " << l << endl;
l_border = - WIDTH*(resolution*1.0/2.0 - l);
r_border = - WIDTH*(resolution*1.0/2.0 - l) + WIDTH;

for(i = 0; i < resolution; i++)
{
for(j = 0; j < resolution; j++)
{
file << getSurface(pixels[i][j], l_border, r_border) << "\t";
}
file << "\n";
}
file << "End" << l << "\n\n\n";
}
file.close();
}

Когда я использую вектор, getSurface (пиксели [i] [j], l_border, r_border) помещается в вектор вместо записи в файл.

Есть ли способ ускорить этот процесс?

5

Решение

Попробуйте изменить формат с текстового на двоичный; это может значительно уменьшить размер файла (и время записи файла).

file.open(filename.c_str(), ios_base::binary);
...
// The following writes a vector into a file in binary format
vector<double> v;
const char* pointer = reinterpret_cast<const char*>(&v[0]);
size_t bytes = v.size() * sizeof(v[0]);
file.write(pointer, bytes);
2

Другие решения

Если bestand является копией остатка и так же, как fileЯ бы заменил endl с '\n',
std::endl очищает ваш выходной поток и разрушает любую пропускную способность, полученную при буферизации iostream.

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

2

По вопросам рекламы [email protected]