Страница 1 из 1

Слишком быстрая запись в файл

Добавлено: 23 июл 2021, 14:28
Sergey Puzanov
Добрый день. Имеется сервер, который получает данные по UDP в виде массива типа double, добавляет к каждому элементу id (соответственно тоже double) и всё это отправляет дальше на клиенты. Размер массива выходит около 500 элементов. Во время получения данных есть возможность начать запись в бинарный файл. Но при начале записи размер файла стремительно растёт, за условные 30 секунд может записать несколько Гб. Откуда такое количество данных?

P.S. Также пробовал записывать в TDMS, но там уже начались другие проблемы - при достижении примерно 700мб появлялась неизвестная ошибка (номер 2500) и соответственно всё переставало писать. Что-то вычитал по поводу переполнения памяти при постоянной записи одной из виаек tdms'a, но это только догадки.

Собственно вопрос - откуда берутся такие объёмы? Спасибо.
запись.png
массив.png
массив.png (8.26 КБ) 1419 просмотров

Re: Слишком быстрая запись в файл

Добавлено: 23 июл 2021, 15:07
Artem.spb
Sergey Puzanov писал(а): 23 июл 2021, 14:28 Собственно вопрос - откуда берутся такие объёмы? Спасибо.
запись.png
Очевидно, что такие объёмы вы создаёте сами :)
У вас в цикле "бесконечно" быстро пишется содержимое массива (через локальную переменную). Откуда появляется этот массив, не понятно, да это и не важно. Важно то, что будь в нём хоть один элемент (= массив НЕ пустой), то это значение пишется и пишется в файл.
Если (подозреваю, что именно так) вам нужно писать только приходящие значения, то нужно лили какие-то флаги/семафоры использовать, или через очередь отправлять на запись.
Если же нужно периодически писать текущее значение массива (независимо от его обновления), то поставьте задержку в цикле.

Доп: цикл в цикле - плохая идея. В частности, вы не сможете завершить работу программы до выключения записи. А это не юзер-френдли. Нужно чтобы пользователь мог остановить программу в любое время, и если в это время идёт запись, то файл нужно корректно закрыть.

Re: Слишком быстрая запись в файл

Добавлено: 23 июл 2021, 15:49
Sergey Puzanov
Artem.spb писал(а): 23 июл 2021, 15:07 Очевидно, что такие объёмы вы создаёте сами :)
Понял, вполне логично, спасибо. Тогда всё же проще будет просто "высчитать" задержку записи через частоту измерений.
Artem.spb писал(а): 23 июл 2021, 15:07 А это не юзер-френдли.
Понимаю, но у нас всё делается по инструкции, поэтому обязательно, если уж начал запись, будь добр её сначала завершить, да и сама кнопка останова записи при этой самой записи - единственная активная :dance:

Re: Слишком быстрая запись в файл

Добавлено: 23 июл 2021, 16:00
Artem.spb
Sergey Puzanov писал(а): 23 июл 2021, 15:49 Тогда всё же проще будет просто "высчитать" задержку записи через частоту измерений.
Может, и проще (но не факт), но не надёжно.
Если вдруг запись задержится, и новый пакет прилетит до записи предыдущего, то вы потеряете кусок данных. Если это не критично (что скорее всего именно так, раз у вас UDP), то ок.
Но опять же, раз у вас UDP, то и нет гарантии, что это уже новый кадр, так что вы будете писать повтор.