Я столкнулся с некоторыми проблемами при записи в файл, а именно, не мог писать достаточно быстро.
Чтобы объяснить, моя цель — захватить поток данных, поступающих через гигабитный Ethernet, и просто сохранить его в файл.
Необработанные данные поступают со скоростью 10 МС/с, затем сохраняются в буфере и впоследствии записываются в файл.
Ниже приведен соответствующий раздел кода:
std::string path = "Stream/raw.dat";
ofstream outFile(path, ios::out | ios::app| ios::binary);
if(outFile.is_open())
cout << "Yes" << endl;
while(1)
{
rxSamples = rxStream->recv(&rxBuffer[0], rxBuffer.size(), metaData);
switch(metaData.error_code)
{
//Irrelevant error checking...
//Write data to a file
std::copy(begin(rxBuffer), end(rxBuffer), std::ostream_iterator<complex<float>>(outFile));
}
}
Проблема, с которой я сталкиваюсь, заключается в том, что запись образцов в файл занимает слишком много времени. Примерно через секунду устройство, отправляющее образцы, сообщает, что его буфер переполнен. После некоторого быстрого профилирования кода почти все время выполнения тратится на std::copy(...)
(99,96% времени, если быть точным). Если я уберу эту строку, я смогу запускать программу часами, не сталкиваясь с переполнением.
Тем не менее, я довольно озадачен тем, как я могу улучшить скорость записи. Я просмотрел несколько сообщений на этом сайте, и кажется, что наиболее распространенным предложением (в отношении скорости) является реализация записи файлов, как я уже сделал, - с использованием std::copy
.
Если это полезно, я запускаю эту программу на Ubuntu x86_64. Мы ценим любые предложения.
tmpfs
) или купите более быстрое запоминающее устройство (например, SSD). - person fuz   schedule 05.08.2015