|
1936 / 1048 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
|
|
Qt быстрая запись в файл10.09.2010, 10:26. Показов 18967. Ответов 39
Метки нет (Все метки)
Добрый день, столкнулся с такой незатейливой проблемой, требуется записывать приходящие от прибора данные в бинарный файл, данные приходят 5-10 раз в секунду, теперь вот думаю как бы правильнее организовать логирование данных в данном случае. Имя файла должно меняться каждый час, т.е. каждый час команды должны записываться в новый файл, и каждый день в новую папку. в общем как - то так.
ЗЫ: ОС - Windows XP (возможно _nix). Есть подозрение, что если просто открыть файл и гадить в него данные, то этого будет достаточно, т.к. ОС/Qt не дураки и кто нибудь из них обязательно создаст буфер для файла. но хотелось бы всё таки уточнить у знающих людей, может был уже опыт.
0
|
|
| 10.09.2010, 10:26 | |
|
Ответы с готовыми решениями:
39
Быстрая запись в файл Быстрая запись в файл Быстрая запись в БД |
|
Модератор
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,981
|
||
| 11.09.2010, 21:38 | ||
![]() И действительно fread/fwrite быстрее работает За то с mmap выглядит намного загадочнее...
0
|
||
|
|
|
| 11.09.2010, 21:40 | |
|
везде в доке пишут, что open() используется для небуферизируемого ввода-вывода.
так же, прототип sync() не принимает дескриптор, что говорит о том, что он не оперирует каким-то конкретным дескриптором. и вообще, в нынешних(не самых старых) версиях glibc, он deprecated.
0
|
|
|
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
|
|||
| 11.09.2010, 21:40 | |||
|
При работе с системными вызовами два: буфер ядра, буфер диска (если есть). Так что, утверждение, что системные open не буферизуются - неверно. Даже если представить, что я не знаю, как оно работает, то подумал бы, что смысла в системном вызове sync не было бы. Но он sync есть. А синкает он данные из буфера ядра в дисковый буфер (если он есть)
0
|
|||
|
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
|
|||
| 11.09.2010, 21:44 | |||
|
0
|
|||
|
Модератор
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,981
|
||||||||||||||||
| 11.09.2010, 21:45 | ||||||||||||||||
|
кстати, если
0
|
||||||||||||||||
|
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
|
|
| 11.09.2010, 21:46 | |
|
niXman, можешь поискать инфу про dirty pages, pdflush, тогда убедишься, он есть )) и системные вызовы еще как буферизуются.
0
|
|
|
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
|
|
| 11.09.2010, 21:56 | |
|
niXman, правда, для работы с файлами все равно лучше использовать fopen и т. д., так как они могут пользовательский буфер делать кратным секторам на диске, что, конечно, повысит производительность. В этом я с тобой согласен. Просто хотел поправить по системным вызовам. А то мало ли че )) знаниями нуна делиццо.
0
|
|
|
|
|
| 11.09.2010, 21:56 | |
|
так же, в книжке говорится, что sync() ставит ВСЕ буферы ядра, всех процессов, в очередь на запись. и так же говориться, что в приложении ее вызывать не хорошо. для сброса буферов конкретного дескриптора, следует применять fsync() или fdatasync(). вот
0
|
|
|
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
|
||
| 11.09.2010, 21:59 | ||
|
0
|
||
|
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
|
|
| 11.09.2010, 22:02 | |
|
niXman,
0
|
|
|
Модератор
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,981
|
|||||||||||||||||
| 11.09.2010, 23:30 | |||||||||||||||||
|
До меня дошло, почему копирование файлов с отображением в памяти медленнее работает - засада вот, где:
0
|
|||||||||||||||||
|
1936 / 1048 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
|
|
| 13.09.2010, 11:09 [ТС] | |
|
Ура! товарищи!!! я развязал Холли Вар!!!!
по поводу вызова функции flush() - я от этого отказался, а не происходила запись на диск (да же при закрытии программы), т.к. я начал мудрить и реализовывать патер "одиночка", а вызвать удаление - естественно забыл, в результате - память выделяется, но не очищается, в общем отказался я от всяких там одиночек, сделал всё по людски и о чудо - всё заработало :-)
0
|
|
|
|
||
| 13.09.2010, 12:35 | ||
Сообщение было отмечено как решение
РешениеВо всех документациях по библиотечным функциям если говорится про буфферизацию, то речь идёт только о буфферизации на уровне библиотеки libc. Т.е. в этом случае данные задерживаются в буффере, который организован в библиотеке и при необходимости сбросить буффер, данные отдаются ядру. Здесь происходит буфферизация внутри одного исполняемого процесса. Т.е. если программа сначала пишет в файл, а потом читает из него (не закрывая файл), то может произойти так, что вся работа по чтению данных пройдёт исключительно из библиотечного буффера. Но если какой-то другой процесс попытается в это время обратиться к файлу, то он этих данных не увидит. Второй уровень буфферизации - на уровне ядра. Когда пользовательское приложение отдаёт ядру данные, то ядро так же их запоминает внутри собственного буффера. При этом на уровне приложений всё выглядит так, как будто файл физически находится на диске: другой процесс обращается к фалу, но он это делает через ядро (через системные вызовы), а ядро уже знает о том, что данные буфферизованы и отдаёт их процессу. Процесс и знать не знает о том, что данных на диске физически нет. Однако если процесс полезет на диск напрямую через работу с устройством, то эти данных там не увидит (ибо они в буффере ядра). Третий уровень - на уровне аппаратуры. Каждый диск имеет свой внутренний буффер, который работает по тому же принципу, как и оба вышестоящих уровня. Т.е. ядро, обращаясь к диску, записывает и получает данные, но где они хранятся в аппаратуре: в буффере или на носителе - ядру неизвестно
7
|
||
|
1936 / 1048 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
|
||
| 13.09.2010, 13:45 [ТС] | ||
|
0
|
||
|
|
|
| 13.09.2010, 13:59 | |
|
Буфферизация уровня библиотеки скорее всего есть на всех системах (на винде точно есть). На уровне ядра - точно сказать не могу.
Буфферизация на уровне ядра - она опасная в том плане, что если машина аварийно отключилась, то рискуем потерять данные, потому как у пользователя нет возможности заставить ядро сбросить буффера на диск. Процедура fflush сбрасывает лишь библиотечный буффер в ядро. Системного вызова flush (который заставил бы ядро сбросить буффер на диск) я что-то не нашёл. А потому есть предположение, что в ядре буфферизация делается короткая. Т.е. процесс отдал ядру данные, ядро их запомнило и поставило исполняться процесс дальше. А затем потихонечку в асинхронном режиме перегонит эти данные на диск. Если они и в правду так, то под виндами логично предположить наличие подобной буфферизации Подозреваю, что буфферизация на диске так же имеет небольшое время жизни. По тем же соображениям
2
|
|
|
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
|
|||||
| 17.09.2010, 14:01 | |||||
|
0
|
|||||
|
|
|
| 17.09.2010, 14:58 | |
|
По части sync и /proc/sys/vm/ - значит у пользователя есть почти нормальная возможность управлять ядром по части сброса буфферов. Таким образом второй уровень буфферизации (на уровне ядра) является по сути безопасным. Безопасным в том плане, что пи любом способе буфферизации имеется риск и на этом уровне он такой же, как и на первом. И скорее всего когда ядро сбрасывает буффера на диск, оно имеет возможность "попросить" диск не держать данные в своём аппаратном буффере.
0
|
|
| 17.09.2010, 14:58 | |
|
Быстрая запись в БД Быстрая запись строк в базу Быстрая запись из List в базу данных Быстрая запись большого колличества данных на питоне Самая быстрая возможность произвести быструю перезапись в файл. Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F
Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU.
Опрашиваются регистры. . .
|
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка:
Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
|
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо
Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
|
|
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман.
Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
|
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
|
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
|
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ
Основная суть и тезисы по измерениям:
0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема.
Объект не может перемещаться в 0D.
1D (Первое измерение):. . .
|