|
1936 / 1048 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
|
|
Qt быстрая запись в файл10.09.2010, 10:26. Показов 18814. Ответов 39
Метки нет (Все метки)
Добрый день, столкнулся с такой незатейливой проблемой, требуется записывать приходящие от прибора данные в бинарный файл, данные приходят 5-10 раз в секунду, теперь вот думаю как бы правильнее организовать логирование данных в данном случае. Имя файла должно меняться каждый час, т.е. каждый час команды должны записываться в новый файл, и каждый день в новую папку. в общем как - то так.
ЗЫ: ОС - Windows XP (возможно _nix). Есть подозрение, что если просто открыть файл и гадить в него данные, то этого будет достаточно, т.к. ОС/Qt не дураки и кто нибудь из них обязательно создаст буфер для файла. но хотелось бы всё таки уточнить у знающих людей, может был уже опыт.
0
|
|
| 10.09.2010, 10:26 | |
|
Ответы с готовыми решениями:
39
Быстрая запись в файл Быстрая запись в файл Быстрая запись в БД |
|
Модератор
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,980
|
||
| 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,980
|
||||||||||||||||
| 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,980
|
|||||||||||||||||
| 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 в базу данных Быстрая запись большого колличества данных на питоне Самая быстрая возможность произвести быструю перезапись в файл. Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Знаете, от чего появляется стресс?
kumehtar 15.07.2026
Стресс появляется оттого, что вы, зная как поступить правильно, делаете наоборот.
Ларри Уингет
|
Нас бьют, а мы крепчаем? Какая чушь!
kumehtar 15.07.2026
Вот это вот бытующее мнение, что человек меняется только под действием проблем, всегда считал вредоносным. Поверь, от проблем у людей появляются не изменения, а нервное расстройство и ПТСР. А. . .
|
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров
В текущей версии модели успешно реализован ключевой механизм. . .
|
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям
Реализованные компоненты:
Механизм закисления почвы через протонную помпу
Конкуренция между типами микориз
pH как триггер сукцессии
C/ P соотношение. . .
|
|
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
|
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
|
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы
## О чём эта статья
В процессе построения ОДУ-модели (система дифференциальных. . .
|
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет)
Содержание проекта
Симуляция вековой (50 лет) экологической сукцессии в почве леса
Основные участники: АМ-гриб, ЭКМ-гриб,. . .
|