|
2 / 2 / 0
Регистрация: 18.09.2009
Сообщений: 107
|
||||||
Забекапить и восстановить вектор из файла02.04.2011, 16:33. Показов 1662. Ответов 16
Метки нет (Все метки)
Имею вектор чаровы по 8 бит каждый элемент std::vector<char> muz; вцелом весь вектор занимает около 200 мегабайт.
Нужно в приложение добавить возможность сохранять и восстанавливать на ходу на raid ssd, притом за максимальную скорость, желательно за миллисекунды. Я представляю это так, узнаю в какой области памяти лежит вектор ... или конкретнее где он начинается и сколько занимает и дальше какой-то специальной функцией копирую его как простую бинарную строку в файл. Помогите пожалуйста реализовать. Добавлено через 3 минуты Вот нашел такой пример для записи:
Функция записывает n элементов длиной size байт из буфера,заданного указателем p,в поток f. Возвращает число записанных элементов. Мне получается нужно задать указатель на начало вектора, определить его длину и тогда можно прямиком копировать его в файл, правильно?
0
|
||||||
| 02.04.2011, 16:33 | |
|
Ответы с готовыми решениями:
16
Способы сохранить (восстановить) вектор прерывания Забекапить базу данных Забекапить БД Postgres c паролем из консоли |
|
623 / 467 / 57
Регистрация: 28.01.2011
Сообщений: 605
|
|
| 02.04.2011, 16:42 | |
|
Да, начало данных в std::vector получаете с помощью &a[0](если есть например объявление std::vector<char> a; ), зная действительную длину можно копировать напрямую, так как данные гарантированно будут располагаться линейно.
0
|
|
|
2 / 2 / 0
Регистрация: 18.09.2009
Сообщений: 107
|
||||||
| 02.04.2011, 17:05 [ТС] | ||||||
|
Вот я ещё одну функцию нашел, тот, кто её написал, сказал что работает очень быстро...
Добавлено через 1 минуту Ma3a немогли бы вы набросать? В инете вообще нет ниодного примера такой реализации, везде все решают проблему перебором массива итератором...
0
|
||||||
|
623 / 467 / 57
Регистрация: 28.01.2011
Сообщений: 605
|
||||||
| 02.04.2011, 17:28 | ||||||
Сообщение было отмечено как решение
Решение
Kadet89, при необходимости быстрого ввода/вывода файлового я предпочитаю использовать istreambuf_iterator/ostreambuf_iterator, так как они позволяют производить операции с файлами напрямую, в обход ненужного в данном случае форматирования и прочих накладных расходов. Пример сейчас приведу.
Добавлено через 4 минуты выйдет примерно так:
Добавлено через 9 минут Kadet89, а ваша версия не работает потому, что в функцию передается std::vector<uint32_t>, хотя должен бы std::vector<char>, так как outfile.write ожидает указателей на char, а у вас вышел бы не char *, а uint32_t *, что компилятору и не нравится. Не по теме: А, уже поправили :)
3
|
||||||
|
108 / 108 / 23
Регистрация: 21.03.2010
Сообщений: 445
|
|
| 02.04.2011, 17:32 | |
|
Очень удивила версия с поблочной записью. Неужели программист считал что таким образом обгонит стандартную библиотеку?
0
|
|
|
2 / 2 / 0
Регистрация: 18.09.2009
Сообщений: 107
|
|||||||
| 02.04.2011, 17:35 [ТС] | |||||||
|
Насчет разных типов данных
получается данный метод применим только для char? А как тогда быть если мне понадобится сохранять значения с более чем 256 уровнями? ... всмысле более 8 бит
_http://stackoverflow.com/questions/1693089/fastest-way-to-write-large-stl-vector-to-file-using-stl
0
|
|||||||
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
| 02.04.2011, 17:42 | |
|
deleted. Не всек чуток.
0
|
|
|
623 / 467 / 57
Регистрация: 28.01.2011
Сообщений: 605
|
|
| 02.04.2011, 17:44 | |
|
Kadet89, если бы мы использовали ostream_iterator, то это бы прокатило, но ostreambuf_iterator - более низкоуровневый интерфейс и работает или с обычными потоками и char типом, либо с широкими потоками и wchar_t соответственно.
1
|
|
|
2 / 2 / 0
Регистрация: 18.09.2009
Сообщений: 107
|
|
| 02.04.2011, 17:47 [ТС] | |
|
А как тогда быть? ostream_iterator использовать или тут уже блочная запись возможно выиграет?
Или переводить int в char[4]?
0
|
|
|
623 / 467 / 57
Регистрация: 28.01.2011
Сообщений: 605
|
|||||||||||
| 02.04.2011, 18:07 | |||||||||||
|
Дак с блочной записью все равно придется иметь дело с ofstream.write, которая как я уже говорил , работает с char const *. Как вариант(да и наверное как оптимальный при учете количества выводимых данных) будет лучше всего воспользоваться чем-то вроде
если использовать ostreambuf_iterator, то можно и так
1
|
|||||||||||
|
2 / 2 / 0
Регистрация: 18.09.2009
Сообщений: 107
|
||||||
| 02.04.2011, 18:26 [ТС] | ||||||
|
Ну и последний вопрос, после записи тогда уж вектора int'ов в файл
0
|
||||||
|
623 / 467 / 57
Регистрация: 28.01.2011
Сообщений: 605
|
||||||
| 02.04.2011, 18:33 | ||||||
|
Можно так
1
|
||||||
|
2 / 2 / 0
Регистрация: 18.09.2009
Сообщений: 107
|
||||||||
| 03.04.2011, 16:45 [ТС] | ||||||||
![]() Большое спасибо Добавлено через 21 час 44 минуты Вот собрал всё в кучу, но не заработало. Файл даже не создается. Создал вручную, выставил права на запись, но всёравно приложение в него ничего не заносит...
Пробовал занести в него значения вручную, но вектор из них не восстановился Консоль:
0
|
||||||||
|
623 / 467 / 57
Регистрация: 28.01.2011
Сообщений: 605
|
|
| 03.04.2011, 17:20 | |
|
Kadet89, собственно о чем я и говорил в последнем посте
![]() myInput работает верно только в том случае , когда действительный размер хранилища вектора в байтах равен тому, сколько байтов будет считано из файла( или хотя бы не меньше ). Насчет того, что файл не создается - у меня вот создается и всё хорошо, здесь хз. По поводу того, что не восстанавливается вектор, проследим работу вашей программы и всё станет сразу ясно: 1) Сначала day_us и vost содержат 10 и 5 нулевых элементов соответственно( resize'ы ), то есть фактический размер их -- 10 и 5. 2) Вы забиваете в day_us еще 5 элементов, то есть day_us.size() == 15 3) Вы вызываете reserve для обоих векторов - это выделяет память под хранилище обоих векторов на 250 элементов, но действительные размеры векторов остались по-прежнему 15 и 5. 4) С myOutput должно быть всё ясно 5) После myInput в vost нормально копируются 15 элементов( потому что вы зарезервировали место под 250 элементов), которые были в day_us, но их вы не увидите, так как реальный размер контейнера остался неизменным и равен по-прежнему 5! Ошибки при myInput не будет , так как хоть и размер вектора равен 5, но память дальше еще есть выделенная. Тем не менее, при выводе вектора vost выведутся только первые 5 элементов , так как vost.size() == 5, о чем я и скачал в самом начале: действительный размер ( vost.size() должен быть равен размеру day_us.size() на момент вызова myInput ). В любом случае для решения данной проблемы можно просто откорректировать размеры vost, чтобы он был такой же большой , как и day_us, соответствующим вызовом resize, только на нужный размер. Добавлено через 4 минуты Короче, когда крутите такие штуки со стандартными контейнерами, никогда не забывайте, что потенциально можете нарушить целостность контейнера, то есть его внутреннее состояние, что может фатально сказаться на работе контейнера и программы вцелом, например как здесь : вектор vost не знает свой действительный размер(элементов-то вроде и 15, но vost.size() равен 5 ).
0
|
|
|
2 / 2 / 0
Регистрация: 18.09.2009
Сообщений: 107
|
|||||||
| 03.04.2011, 18:25 [ТС] | |||||||
|
Да, всё понятно, оказалось файл создаётся не там, где я этого ожидал.
Один момент,
У меня они таким образом зануляются, хотя по документации вроде не должны Но значения там присутствуют, я это проверил вот так
- либо задавать размер вектора иным способом, при котором элементы не затрагиваются, если такой есть, - либо сначала делать resize на нужное количество элементов, а потом из файла не добавлять к ним новые, а как-то записывать поверх начиная с первого.
0
|
|||||||
|
623 / 467 / 57
Регистрация: 28.01.2011
Сообщений: 605
|
|
| 03.04.2011, 18:30 | |
|
Иного корректного способа нет, лучше всего будет именно сначала позаботиться об исходных размерах вызовом reserve, потом настроить реальный размер вызовом resize( reserve для того, чтобы при последующих resize не было лишних выделений памяти ), а потом писать новые элементы поверх старых.
1
|
|
|
2 / 2 / 0
Регистрация: 18.09.2009
Сообщений: 107
|
|
| 03.04.2011, 18:32 [ТС] | |
|
Всё, вопрос закрыт, тема раскрыта полностью, спасибо
0
|
|
| 03.04.2011, 18:32 | |
|
Помогаю со студенческими работами здесь
17
Считать вектор из файла, записать вектор в файл Google Chrome session manager plugin - забекапить Из файла .exe восстановить файл .lpi Восстановить данные из ini-файла в select Восстановить текст из поврежденного файла docx Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|