С Новым годом! Форум программистов, компьютерный форум, киберфорум
Boost C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/16: Рейтинг темы: голосов - 16, средняя оценка - 4.63
 Аватар для RibGeDx
3 / 3 / 2
Регистрация: 11.05.2012
Сообщений: 38

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

06.03.2013, 19:20. Показов 3494. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.03.2013, 19:20
Ответы с готовыми решениями:

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

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

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

4
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
07.03.2013, 01:36
Цитата Сообщение от 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  [ТС]
Jupiter, пробовал, копировал файл еще дольше
0
1443 / 1326 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
08.03.2013, 18:04
Цитата Сообщение от RibGeDx Посмотреть сообщение
Возможно ли такое?
зависит от дисковой системы.

Цитата Сообщение от RibGeDx Посмотреть сообщение
Но, я думаю, с этого можно выжать больше. Как я понимаю, нужно сделать два буфера по два потока на каждый, тогда скорость увеличится в разы. Но как это сделать?
У тебя утечка памяти образовалась, а ты про многопоточность.
Т.к. параллельного доступа к диску нет, то и проку от многопоточности нет.
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.03.2013, 18:14
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
У тебя утечка памяти образовалась, а ты про многопоточность.
Т.к. параллельного доступа к диску нет, то и проку от многопоточности нет.
Прок был бы если были бы еще какие нибудь вычисления ....
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.03.2013, 18:14
Помогаю со студенческими работами здесь

Запись буфера в boost asio
Изучаю данный пример http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/example/cpp11/echo/async_tcp_echo_server.cpp Появились...

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

Boost Log - undefined reference to `boost::system::system_category()'
Пытаюсь скомпилировать код из примеров Boost Log:#include &lt;boost/log/trivial.hpp&gt; int main(int, char*) { ...

boost.asio example - файл не является приложением win32
Собрал пример chat отсюда http://www.boost.org/doc/libs/1_38_0/doc/html/boost_asio/examples.html Сборка Release. Локально все...

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


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru