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

Работа с файлами и базами данных
Ответить
Sergey Puzanov
beginner
beginner
Сообщения: 34
Зарегистрирован: 05 ноя 2020, 08:26
Версия LabVIEW: 18, 20.0f1
Благодарил (а): 11 раз
Поблагодарили: 2 раза
Контактная информация:

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

Сообщение Sergey Puzanov »

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

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

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

Activity Автор
doctor
doctor
Сообщения: 2726
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 25 раз
Поблагодарили: 97 раз
Контактная информация:

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

Сообщение Artem.spb »

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

Доп: цикл в цикле - плохая идея. В частности, вы не сможете завершить работу программы до выключения записи. А это не юзер-френдли. Нужно чтобы пользователь мог остановить программу в любое время, и если в это время идёт запись, то файл нужно корректно закрыть.
Sergey Puzanov
beginner
beginner
Сообщения: 34
Зарегистрирован: 05 ноя 2020, 08:26
Версия LabVIEW: 18, 20.0f1
Благодарил (а): 11 раз
Поблагодарили: 2 раза
Контактная информация:

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

Сообщение Sergey Puzanov »

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

Activity Автор
doctor
doctor
Сообщения: 2726
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 25 раз
Поблагодарили: 97 раз
Контактная информация:

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

Сообщение Artem.spb »

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

Вернуться в «Сохранение данных»