LINUX.ORG.RU

С++ vs прямая запись на флешку

 


0

1

Поругайте или предложите более разумную идею, пожалуйста

Нужно писать (иногда одновременно читать записанное) с камеры видеоархив на USB или SD карты в формате MJPEG, для максимального сохранения ресурса и объема планирую выполнять ЦИКЛИЧЕСКУЮ запись без файловой системы напрямую в физические блоки, выделив в начале область под «журнал» из пары 32 байта временная метка + 32 байта адрес физического блока флешки.

Как я понял физические блоки на дешевых флешках обычные 512 байт, получается нужно зарезервировать под журнал с данными в 64 байта в блоках по 512 байт и писать в кеш кадры кратно тому же объему перед записью.

Поиск для чтения делать по журналу - каждая временная метка через равные сравнительно промежутки времени.

★★★

использование MJPEG обусловлено тем, что у меня их куча образовалась + вроде как лучше для качества картинки в архиве + говорят распознавание с такого потока точнее

wolverin ★★★
() автор топика

непонятно причем тут с++ и зачем давать по 32 байта на «временную метку» и тем более на «адрес физического блока». такой длиной адреса удобно атомы во вселенной адресовать.

alysnix ★★★
()

критика тут простая. то что ты хочешь сделать это куцая флешевая файловая система.

либо надо брать готовую…сам ищи, либо писать свою. я когда-то писал полноценную такую систему, в принципе это не так сложно, но ты должен учесть такие фичи флешевых фс

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

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

alysnix ★★★
()
Ответ на: комментарий от alysnix

непонятно причем тут с++

при том, что это все на gcc надо наваять мне

зачем давать по 32 байта на «временную метку»

ну как бы число с плавающей точкой, чтобы не делать преобразований

тем более на «адрес физического блока»

потому как физический блок надо писать 1 раз целиком, нельзя что то добаписать иба он стирается и пишется заново весь, а раз размер 512 байт, то вопщим то все равно метка делает пратически пустой блок

wolverin ★★★
() автор топика
Последнее исправление: wolverin (всего исправлений: 1)
Ответ на: комментарий от alysnix
  1. блок пишется 1 раз целиком
  2. нет никакой равномерности, они пишутся 1 раз и перезаписываются 1 раз когда доходит цикл
  3. поиск потом нужен такой же быстрый как и запись, а без журнала не получается как то

куцая не куцая, а вроде как теоретически достаточная, просто меня напрягают такие вещи как размер физического блока в несколько мегабайт у флешек судя по хабру

wolverin ★★★
() автор топика
Ответ на: комментарий от wolverin

ну как бы число с плавающей точкой, чтобы не делать преобразований

1.время отродясь не было плавающим числом. 2.даже double в С++ 8 байт. 3.если есть журнал..и ты его все время пишешь вместе с блоками данных - ты блоки журнала первыми и убьешь.

alysnix ★★★
()
Ответ на: комментарий от alysnix

alysnix

ога! тупанул я, с битами перепутал )))

блоки журнала предполагаю пишутся по 512 байт, в котором одна метка времени + адрес блока т.е. 16 байт всего лишь занято, размер журнала всегда конечной длины.

wolverin ★★★
() автор топика
Последнее исправление: wolverin (всего исправлений: 1)
Ответ на: комментарий от wolverin

т.е. как бы надо 2 условия соблюсти

  1. максимальный ресурс флешки
  2. максимальная скорость ПОСЛЕДОВАТЕЛЬНЫХ записи и чтения
wolverin ★★★
() автор топика
Последнее исправление: wolverin (всего исправлений: 2)
Ответ на: комментарий от wolverin

у тебя усб накопитель, он сам все ремапит и заботится о равномерности записи по идее.

журнал лишнее, я б не делал. журнал создавался бы в памяти при старте устройства(ну или подключении накопителя), сканом блоков и анализом их заголовков. у нас было так. но там был голый чип флеш памяти, а не девайс с собственным контроллером.

alysnix ★★★
()
Последнее исправление: alysnix (всего исправлений: 1)
Ответ на: комментарий от alysnix

сканить можно конеш в память, но я имею органиченные ресурсы по железу, что то вроде расбери или нанопи

а вообще надо об этом подумать, спасибо

wolverin ★★★
() автор топика
Последнее исправление: wolverin (всего исправлений: 1)
Ответ на: комментарий от wolverin

моя фс работала на 16 кажется мгц. и 16 битном проце, насколько я помню. но она была полновесной фс с дирами, и файлами.

короче никакого журнала там не было, журнал генерился при старте устройства, в памяти. был там и контроль бедблоков.

в твоем случае и бедблоков то не будет небось. накопитель будет ремапить физблоки тебе.

короче я б с журналом не связывался, писал просто блоки данных с короткими заголовками, а при старте строил журнал.

alysnix ★★★
()
Ответ на: комментарий от alysnix

согласен, можно и меньшие ресурсы использовать, но у меня вопрос адекватности времени работы важен, надо тестировать за сколько сд карты будут читаться объемом 64-128Гб, с другой стороны в целом нет жесткого ограничения именно на первый запуск

wolverin ★★★
() автор топика

Плохая идея. Воспользуйся ФС созданными специально для флешек. Там все фичи уже есть.

ox55ff ★★★★★
()

физические блоки на дешевых флешках обычные 512 байт

Там же запись страницами идёт, а не блоками.

Посмотри ролик Cluster про создание картриджа-многоигровки для NES. Он там решал проблему усиления записи для флеша.

https://www.youtube.com/watch?v=VihgDVlgBY0

Вроде тут тоже https://www.youtube.com/watch?v=LwKKMoTirSo

Radjah ★★★★★
()
Ответ на: комментарий от Radjah

Radjah

Спасибо посмотрю, на Хабре пишут и странично и поблоково можно, хз в чем разница кроме размера

wolverin ★★★
() автор топика
Ответ на: комментарий от wolverin

хакер

Это не серьёзно. F2fs делает то что ты хочешь написать самостоятельно. Но уже отлажена и встроена в ядро.

Я так понял, что тебе просто хочется запилить свою фс, поэтому выбрасываешь все советы. От нас то что ты тогда хочешь?

ox55ff ★★★★★
()
Ответ на: комментарий от ox55ff

Нет, мне не нужна фс как таковая вообще, мне нужно писать и читать покругу один большой файл на флешке, у меня нет случайного доступа и ограничен в объеме кеша в памяти

wolverin ★★★
() автор топика
Ответ на: комментарий от wolverin

Автомобильных? Какой нибудь fat, чтобы юзер мог вставить флешку в комп с виндой и скачать видео. На взрослых видеорегистраторах что я видел была ext4. Но там диски hdd, а не флеш.

ox55ff ★★★★★
()
Ответ на: комментарий от ox55ff

Нет, там не эти фс, они создают много лишнего мусора, в видеосерверах не выполняется никакое форматирование после установки нового диска

Да и подключение дисков оттуда никакой фс не находит

wolverin ★★★
() автор топика
Ответ на: комментарий от wolverin

Лично видел. Диски как раз форматировать надо. Может тебе попался такой рег особенный.

Они не пишут на диск файлы в mp4. Создают несколько больших файлов неизвестного формата и внутри них пишут сырые h264 кадры. Ключевые кадры и промежуточные в разных файлах.

ox55ff ★★★★★
()
Ответ на: комментарий от wolverin

круговая запись регистратора самый щадящий для флехи режим, так что живут они долго. больший урон нанесет постоянная перезапись метаданных фс.
все прелести ntfs для авторегистратора нафих не нужны. прикладная необходимость в нтфс ext* и т.д. появляется только во флешках более 4 гб. нападал на статью в которой описывали как в нтфс отключить журнал и что-то еще для уменьшения лишних измывательств над ячейками.
намудрить что-либо хитроумно-долгоживущее для режима круговой записи практически практически не получится. потратишь время на разработку с практически нулевым (продление жизни флешки) финишным результатом.

pfg ★★★★★
()
Последнее исправление: pfg (всего исправлений: 1)
28 июня 2022 г.
Ответ на: комментарий от wolverin

у меня их куча образовалась + вроде как лучше для качества картинки в архиве + говорят распознавание с такого потока точнее

врут. MJPEG минимум в 10 раз жирнее чем H264 при аналогичном качестве видео. С H265 разница может быть ещё больше.

max_lapshin ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.