Форум программистов, компьютерный форум, киберфорум
Наши страницы
Boost C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.92/12: Рейтинг темы: голосов - 12, средняя оценка - 4.92
RibGeDx
3 / 3 / 2
Регистрация: 11.05.2012
Сообщений: 38
1

Boost и побайтное чтение/запись в файл

06.03.2013, 19:20. Просмотров 2145. Ответов 4
Метки нет (Все метки)

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

Вот код, который я смог написать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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 сек.). Но, я думаю, с этого можно выжать больше. Как я понимаю, нужно сделать два буфера по два потока на каждый, тогда скорость увеличится в разы. Но как это сделать?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.03.2013, 19:20
Ответы с готовыми решениями:

Boost и чтение/запись в ttyACM0
Доброго времени суток. У меня есть микроконтроллер, к которому мне да протокол...

Бинарное чтение/запись переменной из Multiprecision в бинарный файл
Подскажите, пожалуйста, как можно считать/записать бинарно файл используя...

Запись буфера в boost asio
Изучаю данный пример...

Чтение и запись в один и тот же файл с CreateFile
Добрый день. необходимо, чтобы можно было открыть файл, произвести из него...

Boost начало работы: Undefined reference to `boost::system::generic_category() '
Добрый день Собственно говоря возникла необходимость использовать boost в...

4
Jupiter
Каратель
Эксперт С++
6569 / 3990 / 400
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
07.03.2013, 01:36 2
Цитата Сообщение от RibGeDx Посмотреть сообщение
Файл размером 1 Гб копирует за 13 сек., что уже неплохой результат (WinAPI CopyFile - 23 сек.).
а boost::filesystem::copy_file что? хотя он вроде на основе WinAPI CopyFile реализован, но все же проверьте
0
RibGeDx
3 / 3 / 2
Регистрация: 11.05.2012
Сообщений: 38
07.03.2013, 19:47  [ТС] 3
Jupiter, пробовал, копировал файл еще дольше
0
Dmitriy_M
1429 / 1309 / 131
Регистрация: 20.03.2009
Сообщений: 4,677
Записей в блоге: 11
08.03.2013, 18:04 4
Цитата Сообщение от RibGeDx Посмотреть сообщение
Возможно ли такое?
зависит от дисковой системы.

Цитата Сообщение от RibGeDx Посмотреть сообщение
Но, я думаю, с этого можно выжать больше. Как я понимаю, нужно сделать два буфера по два потока на каждый, тогда скорость увеличится в разы. Но как это сделать?
У тебя утечка памяти образовалась, а ты про многопоточность.
Т.к. параллельного доступа к диску нет, то и проку от многопоточности нет.
0
Avazart
Эксперт С++
7725 / 5634 / 549
Регистрация: 10.12.2010
Сообщений: 25,412
Записей в блоге: 17
08.03.2013, 18:14 5
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
У тебя утечка памяти образовалась, а ты про многопоточность.
Т.к. параллельного доступа к диску нет, то и проку от многопоточности нет.
Прок был бы если были бы еще какие нибудь вычисления ....
0
08.03.2013, 18:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.03.2013, 18:14

Boost Log - undefined reference to `boost::system::system_category()'
Пытаюсь скомпилировать код из примеров Boost Log:#include...

Сериализировать структуру в файл с помощью библиотеки boost
привет всем) Есть структура: struct MyStruct { vector&lt;string&gt; v; int n;...

boost.asio example - файл не является приложением win32
Собрал пример chat отсюда ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru