Методы записи критических текстовых данных - PullRequest
2 голосов
/ 15 ноября 2008

Мы берем данные типа text / csv за длительные периоды (~ дни) из дорогостоящих экспериментов, поэтому следует избегать повреждения файлов любой ценой.

Недавно файл был скопирован из Проводника в XP во время эксперимента, и данные были частично потеряны, возможно, из-за конфликта множественного доступа.

Какие есть хорошие методы, чтобы избежать такой потери? - Мы используем Delphi в системах Windows XP.

Некоторые идеи, которые мы выдвинули, перечислены ниже - мы приветствуем комментарии, а также ваш собственный вклад.

Ответы [ 8 ]

9 голосов
/ 15 ноября 2008

Использование базы данных в качестве вторичного механизма хранения данных и использование механизмов атомарных транзакций

6 голосов
/ 15 ноября 2008

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

1 голос
/ 16 ноября 2008

Если эти машины находятся в сети: отправьте сообщение HTTP с данными регистрации на веб-сервер. (отправка пакетов UDP будет еще проще).

Убедитесь, что вы копируете только старые данные. Если у вас есть временная метка в имени файла с разрешением 1 час, вы можете безопасно скопировать данные старше 1 часа.

0 голосов
/ 17 ноября 2008

В каждом эксперименте часто используется файл «работа» и «готово». Рабочий файл открывается исключительно, а готовый файл копируется в место в сети. Приложение на принимающей машине будет передавать эти файлы в базу данных. Если проводник попытается переместить или скопировать рабочий файл, он получит ошибку «Отказано в доступе».

Файл «Работа» станет «выполненным» через определенный период (скажем, 6/12/24 часа или любой другой период). Таким образом, он создает другой рабочий файл (имя должно содержать метку времени) и отправляет «сделано» по сети (или человек может сделать это, что вы делаете на самом деле, если я правильно понимаю ваш текст).

Копирование файла во время использования требует его повреждения.

0 голосов
/ 16 ноября 2008

Я думаю, что вы ищете Win32 CreateFile API с этими флагами:

FILE_FLAG_WRITE_THROUGH: Операции записи не будут проходить через какой-либо промежуточный кеш, они будут идти непосредственно на диск.

FILE_FLAG_NO_BUFFERING: файл или устройство открываются без системного кэширования для чтения и записи данных. Этот флаг не влияет на кеширование жесткого диска или отображение файлов в памяти. Существуют строгие требования для успешной работы с файлами, открытыми с помощью CreateFile с использованием флага FILE_FLAG_NO_BUFFERING, подробнее см. Буферизация файлов.

0 голосов
/ 15 ноября 2008

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

0 голосов
/ 15 ноября 2008

Запись точек данных дискретно, т. Е. Открывать и закрывать файловый дескриптор для каждой записи данных - это сокращает время обращения к файлу при условии, что время между точками данных мало

0 голосов
/ 15 ноября 2008

Запись данных в буферный файл в непонятном каталоге и периодическое копирование данных в «общедоступный» файл данных (например, каждые 10 точек), что сокращает количество операций записи и обеспечивает резервное копирование

...