Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.03.2013, 19:23   #1
RibGeDx
Пользователь
 
Аватар для RibGeDx
 
Регистрация: 10.05.2012
Сообщений: 16
По умолчанию Boost и побайтное чтение/запись в файл

Всем привет! Есть такой вопрос, как очень быстро скопировать файл? Скорость нужна в пределах~600 мб/сек. Возможно ли такое?

Вот код, который я смог написать:
Код:
void _copy_file(const char *FromFile, const char *ToFile, int bufsize)
{
	ifstream stream;
	long long tmp = 0;
	long long fSize = 0;
	char* buffer = new char[bufsize];

	stream.open(FromFile, BOOST_IOS::binary);
	file_sink out(ToFile, BOOST_IOS::binary);
	stream.seekg(0, BOOST_IOS::end);
    fSize = stream.tellg();
	stream.seekg(0, BOOST_IOS::beg);	

	if (fSize < bufsize) 
	{
		stream.read(buffer, fSize);
		out.write(buffer, fSize);
		return;
	}	

	while(stream)
	{
		if ((fSize - tmp) < bufsize)
		{
		  stream.read(buffer, (fSize - tmp));
		  out.write(buffer, (fSize - tmp));
		  break;
		}
		stream.read(buffer, bufsize);
		out.write(buffer, bufsize);
		tmp += bufsize;		
	}
}

void boost_copy_file(const char *FromFile, const char *ToFile, int bufsize)
{
	size_t num_threads = boost::thread::hardware_concurrency();
	boost::thread_group threads;

    for (int i = 0; i < num_threads; ++i)
		threads.create_thread(boost::bind(&_copy_file, FromFile, ToFile, bufsize));
	threads.join_all();	
}
Файл размером 1 Гб копирует за 13 сек., что уже неплохой результат (WinAPI CopyFile - 23 сек.). Но, я думаю, с этого можно выжать больше. Как я понимаю, нужно сделать два буфера по два потока на каждый, тогда скорость увеличится в разы. Но как это сделать?
RibGeDx вне форума Ответить с цитированием
Старый 06.03.2013, 19:45   #2
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

RibGeDx

Скорость нужна в пределах~600 мб/сек. Возможно ли такое?

если железо позволяет, то и больше возможно.

вот например работа ssd в рейде0



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

если диск не sdd, то скорее всего загнется на сиках.
а так - запустить несколько потоков, в каждом спозиционироваться на свою часть файла и копировать.

а еще лучше - сделать две проекции в память (read и write) и банально копировать память.
почитать об этом ты сможешь у Рихтера.
Rififi вне форума Ответить с цитированием
Старый 06.03.2013, 19:53   #3
RibGeDx
Пользователь
 
Аватар для RibGeDx
 
Регистрация: 10.05.2012
Сообщений: 16
По умолчанию

Rififi
Если на SSD такая скорость, какая же будет на RAM-диске? :D

По сути - спасибо. Буду разбираться ))
RibGeDx вне форума Ответить с цитированием
Старый 06.03.2013, 21:53   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Цитата:
Сообщение от RibGeDx Посмотреть сообщение
тогда скорость увеличится в разы.
Не увеличится и тем более не в разы, если только не копируете очень маленькими блоками. Сколько бы потоков не запускали, все равное быстрее железа копироваться не будет.

Самую высокую скорость на чтение мне удавалось достичь через ReadFile блоками по 256К. Думаю, что если открыть файлы с опциями FILE_FLAG_NO_BUFFERING и FILE_FLAG_SEQUENTIAL_SCAN то скорость вырастет еще немного, но не сильно.
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чтение\запись в файл VirtualAngel Помощь студентам 2 12.02.2011 12:54
Чтение и запись из/в файл Pirotexnik Общие вопросы C/C++ 7 28.01.2011 16:54
Чтение и запись в файл Dycek Общие вопросы C/C++ 0 18.01.2011 15:04
Чтение и запись в файл. Ky3Heu, Помощь студентам 0 01.01.2010 11:24
Чтение и запись в файл deagle05 Общие вопросы C/C++ 3 22.12.2009 00:11