Forum Webscript.Ru

Программирование => Perl => Тема начата: C++ от 08 Февраля 2003, 00:05:56

Название: Удаление записей из файла, наиболее безопасный способ?
Отправлено: C++ от 08 Февраля 2003, 00:05:56
Чтобы удалить записи из файла можно использовать кучу способов, например:
1) записать в новый, потом новый переименовать;
2) считать весь его в память (если он не большой), обрезать его до нуля, и записать в него же нужные данные;
3) записать в новый файл, обрезать старый, переписать из старого в новый;
4) и т.д.
Мне очень важно найти оптимальный способ, чтобы обеспечить надлежащую безопасность, и при этом быстроту выполнения операции.
Какие есть мысли, свои и комментарии к вышеперечисленным способам?
Особенно интересны комментарии к способу под номером 1.
Название: Удаление записей из файла, наиболее безопасный способ?
Отправлено: Отец Никон от 08 Февраля 2003, 00:21:57
С++, мне кажется, очевидно, что первый способ - самый лучший, т.к. выполняется самое меньшее количество операций.
Название: Удаление записей из файла, наиболее безопасный способ?
Отправлено: C++ от 08 Февраля 2003, 00:45:10
а при переименовании chmod сохраняется?
еще плиз:)
Название: Удаление записей из файла, наиболее безопасный способ?
Отправлено: Wyclef от 08 Февраля 2003, 01:50:54
Цитировать

2) считать весь его в память (если он не большой), обрезать его до нуля, и записать в него же нужные данные;


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

На это время файл желательно залочить, а для больших объемов данных я бы не использовал текстовые файлы как контейнер.
Название: Удаление записей из файла, наиболее безопасный способ?
Отправлено: Mog. от 08 Февраля 2003, 08:18:26
Цитировать
1) записать в новый, потом новый переименовать

Цитировать
выполняется самое меньшее количество операций

Это ещё под вопросом. Из старого то файла читать все одно приходится.
Цитировать
обеспечить надлежащую безопасность
Чего?
Название: Удаление записей из файла, наиболее безопасный способ?
Отправлено: C++ от 08 Февраля 2003, 12:11:37
Цитировать
Цитата:
обеспечить надлежащую безопасность


Чего?


безопасность данных, т.е. чтоб ничего не было утеряно или изменены не нужные поля, при этом гарантированно обновление.....
Название: Удаление записей из файла, наиболее безопасный способ?
Отправлено: Mog. от 08 Февраля 2003, 13:51:28
Цитировать
безопасность данных

При разделяемом доступе к файлу?
Используй flock
Название: Удаление записей из файла, наиболее безопасный способ?
Отправлено: C++ от 08 Февраля 2003, 15:58:45
про flock я знаю
интересует утеря информации, к примеру из-за сбоя в системе.
при каком способе это наиболее вероятно?
Название: Удаление записей из файла, наиболее безопасный способ?
Отправлено: NeoNox от 08 Февраля 2003, 16:38:13
Цитировать
Мне очень важно найти оптимальный способ, чтобы обеспечить надлежащую безопасность, и при этом быстроту выполнения операции.

Цитировать
интересует утеря информации, к примеру из-за сбоя в системе.

100% вероятности от сбоя при хранении информации в файле быть не может(!)
Используй базы данных и будешь спать более спокойно.
Насчет варианта #1. Я не понял. а что считать данные из файла и записать туда измененные данные за один заход нельзя? Это и будет наиболее удачный вариант.   Без дерганья дескрипторов файлов, причем на каждом этапе может потенциально быть сбой(это я с точки зрения параноика говорю :) )...Про flock уже сказали.
Название: Удаление записей из файла, наиболее безопасный способ?
Отправлено: КшЫуфксрук от 08 Февраля 2003, 19:41:04
> а что считать данные из файла и записать туда измененные данные за один заход нельзя

Что останется в этом файле, если во время записи пропадет энергия (кто-то нажмет на ресет, выдернет шнур питания, система повиснет, нужное подчеркнуть)? Первый вариант должен быть более безопасным, у нас по крайней мере остается неизмененный файл, а если операция записи нового прошла успешно, тогда мы его переименовываем, а это операция практически мгновенная.
Название: Удаление записей из файла, наиболее безопасный способ?
Отправлено: Phoinix от 08 Февраля 2003, 19:50:21
Ты же просто сначала читаешь данные из файла, а потом поверх него записывашь новый, поврежденние данных возможно только когда идет процесс записи...
А если ты хочешь сделать все в один проход то тебе прийдется, как минимум, заблокировать файл, и потом обрабатывать данные... и получится что файл у тебя будет недоступен какое-то время, что само по себе может ривести к тормозам, но с другой стороны, если ты будешь блокировать файл сразу как только прочитал, и разблокировать только после его обновления, ты снизишь до минимума потерю данных...
Название: Удаление записей из файла, наиболее безопасный способ?
Отправлено: Mog. от 08 Февраля 2003, 19:52:27
В любом случае
Цитировать
100% вероятности от сбоя при хранении информации в файле быть не может(!)

А жаль!
Название: Удаление записей из файла, наиболее безопасный способ?
Отправлено: Wyclef от 08 Февраля 2003, 21:04:11
Цитировать
чтоб ничего не было утеряно или изменены не нужные поля


Это уже зависит от твоего алгоритма проверки на нужность/ненужность данных...

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


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

Цитировать
Что останется в этом файле, если во время записи пропадет энергия (кто-то нажмет на ресет, выдернет шнур питания, система повиснет, нужное подчеркнуть)?


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

Сколько интересно у вас времени занимает перезапись файла, засеките для интереса... :))) А то бубнеж, какой-то порожняковый, не говоря уже о требованиях к безопасности для хранения данных в текстовых файлах...
Название: Удаление записей из файла, наиболее безопасный способ?
Отправлено: КшЫуфксрук от 08 Февраля 2003, 22:53:28
> интересует утеря информации, к примеру из-за сбоя в системе

> не зря же люди flock придумали

flock придумали для регулирования доступа к файлу разными процессами, причем этим регулированием занимается ОС. От нештатных ситуаций (когда ОС или компьютер вообще повиснет) оно не спасет.

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

Если вероятностью этого события можно пренебречь, тогда другое дело, но решать это должны не мы, а автор вопроса.
Название: Удаление записей из файла, наиболее безопасный способ?
Отправлено: Wyclef от 08 Февраля 2003, 23:51:43
Цитировать
flock придумали для регулирования доступа к файлу разными процессами


При сбое сервера как ранее сказали ничего не спасет, а при попытке клиента повторить в процессе запрос или при нескольких - вполне.

Впору плавно перейти на обсуждение теории вероятности сбоения серверов при попытке изменения 10кб файлов :), только оно то не стоит...

Автор то уже просек тему? Алло?
Название: Удаление записей из файла, наиболее безопасный способ?
Отправлено: КшЫуфксрук от 09 Февраля 2003, 01:15:58
> При сбое сервера как ранее сказали ничего не спасет

Да почему не спасет? Если писать в новый файл, то последнее изменение конечно не сохранится (а оно нам и не надо, если сервер глюкнул как раз в тот момент, когда пришел запрос, то какая разница, глюкнет он перед самым приходом запроса или же сразу после, все равно этот запрос не будет обработан), но по крайней мере все СТАРЫЕ данные останутся. А если затирать оригинальный файл, тогда и за сохранность старых данных поручиться нельзя.

Про вероятность не будем:) Но если просили безопасный способ, то зачем советовать менее безопасный?
Название: Удаление записей из файла, наиболее безопасный способ?
Отправлено: Mog. от 10 Февраля 2003, 07:55:45
Цитировать
кто-то нажмет на ресет, выдернет шнур питания
а по рукам надавать? :)

Цитировать
специально пнет вилку от сервера
а по ногам? :)
Название: Удаление записей из файла, наиболее безопасный способ?
Отправлено: C++ от 11 Февраля 2003, 20:34:56
Всем большое спасибо!
Решил делать с использованием переименовывания...