Forum Webscript.Ru
Программирование => Perl => Тема начата: C++ от 08 Февраля 2003, 00:05:56
-
Чтобы удалить записи из файла можно использовать кучу способов, например:
1) записать в новый, потом новый переименовать;
2) считать весь его в память (если он не большой), обрезать его до нуля, и записать в него же нужные данные;
3) записать в новый файл, обрезать старый, переписать из старого в новый;
4) и т.д.
Мне очень важно найти оптимальный способ, чтобы обеспечить надлежащую безопасность, и при этом быстроту выполнения операции.
Какие есть мысли, свои и комментарии к вышеперечисленным способам?
Особенно интересны комментарии к способу под номером 1.
-
С++, мне кажется, очевидно, что первый способ - самый лучший, т.к. выполняется самое меньшее количество операций.
-
а при переименовании chmod сохраняется?
еще плиз:)
-
2) считать весь его в память (если он не большой), обрезать его до нуля, и записать в него же нужные данные;
Я бы считал весь файл в переменную или массив, и записывал данные в этот же файл, по-ходу пропуская ненужные.
На это время файл желательно залочить, а для больших объемов данных я бы не использовал текстовые файлы как контейнер.
-
1) записать в новый, потом новый переименовать
выполняется самое меньшее количество операций
Это ещё под вопросом. Из старого то файла читать все одно приходится.
обеспечить надлежащую безопасность
Чего?
-
Цитата:
обеспечить надлежащую безопасность
Чего?
безопасность данных, т.е. чтоб ничего не было утеряно или изменены не нужные поля, при этом гарантированно обновление.....
-
безопасность данных
При разделяемом доступе к файлу?
Используй flock
-
про flock я знаю
интересует утеря информации, к примеру из-за сбоя в системе.
при каком способе это наиболее вероятно?
-
Мне очень важно найти оптимальный способ, чтобы обеспечить надлежащую безопасность, и при этом быстроту выполнения операции.
интересует утеря информации, к примеру из-за сбоя в системе.
100% вероятности от сбоя при хранении информации в файле быть не может(!)
Используй базы данных и будешь спать более спокойно.
Насчет варианта #1. Я не понял. а что считать данные из файла и записать туда измененные данные за один заход нельзя? Это и будет наиболее удачный вариант. Без дерганья дескрипторов файлов, причем на каждом этапе может потенциально быть сбой(это я с точки зрения параноика говорю :) )...Про flock уже сказали.
-
> а что считать данные из файла и записать туда измененные данные за один заход нельзя
Что останется в этом файле, если во время записи пропадет энергия (кто-то нажмет на ресет, выдернет шнур питания, система повиснет, нужное подчеркнуть)? Первый вариант должен быть более безопасным, у нас по крайней мере остается неизмененный файл, а если операция записи нового прошла успешно, тогда мы его переименовываем, а это операция практически мгновенная.
-
Ты же просто сначала читаешь данные из файла, а потом поверх него записывашь новый, поврежденние данных возможно только когда идет процесс записи...
А если ты хочешь сделать все в один проход то тебе прийдется, как минимум, заблокировать файл, и потом обрабатывать данные... и получится что файл у тебя будет недоступен какое-то время, что само по себе может ривести к тормозам, но с другой стороны, если ты будешь блокировать файл сразу как только прочитал, и разблокировать только после его обновления, ты снизишь до минимума потерю данных...
-
В любом случае
100% вероятности от сбоя при хранении информации в файле быть не может(!)
А жаль!
-
чтоб ничего не было утеряно или изменены не нужные поля
Это уже зависит от твоего алгоритма проверки на нужность/ненужность данных...
Первый вариант должен быть более безопасным, у нас по крайней мере остается неизмененный файл, а если операция записи нового прошла успешно, тогда мы его переименовываем, а это операция практически мгновенная.
Зачем делать несколько действий, когда можно обойтись одним - не зря же люди flock придумали.
Что останется в этом файле, если во время записи пропадет энергия (кто-то нажмет на ресет, выдернет шнур питания, система повиснет, нужное подчеркнуть)?
Если скрипт запустился, то он отработает независимо от проблем у клиента. А если сисадмин под пивом случайно или специально пнет вилку от сервера (нужное подчеркнуть) во время записи то могут быть проблемы.
Сколько интересно у вас времени занимает перезапись файла, засеките для интереса... :))) А то бубнеж, какой-то порожняковый, не говоря уже о требованиях к безопасности для хранения данных в текстовых файлах...
-
> интересует утеря информации, к примеру из-за сбоя в системе
> не зря же люди flock придумали
flock придумали для регулирования доступа к файлу разными процессами, причем этим регулированием занимается ОС. От нештатных ситуаций (когда ОС или компьютер вообще повиснет) оно не спасет.
Просили наиболее безопасный способ. Я же не знаю, сколько мегабайт нужно писать. Гарантировать сохранение данных можно только в том случае, если писать в новый файл. Даже если файл всего 10 кб, он уже не поместится на один блок диска (в большинстве случаев) и писать его придется в два захода, а значит повисание системы в этот момент повредит данные.
Если вероятностью этого события можно пренебречь, тогда другое дело, но решать это должны не мы, а автор вопроса.
-
flock придумали для регулирования доступа к файлу разными процессами
При сбое сервера как ранее сказали ничего не спасет, а при попытке клиента повторить в процессе запрос или при нескольких - вполне.
Впору плавно перейти на обсуждение теории вероятности сбоения серверов при попытке изменения 10кб файлов :), только оно то не стоит...
Автор то уже просек тему? Алло?
-
> При сбое сервера как ранее сказали ничего не спасет
Да почему не спасет? Если писать в новый файл, то последнее изменение конечно не сохранится (а оно нам и не надо, если сервер глюкнул как раз в тот момент, когда пришел запрос, то какая разница, глюкнет он перед самым приходом запроса или же сразу после, все равно этот запрос не будет обработан), но по крайней мере все СТАРЫЕ данные останутся. А если затирать оригинальный файл, тогда и за сохранность старых данных поручиться нельзя.
Про вероятность не будем:) Но если просили безопасный способ, то зачем советовать менее безопасный?
-
кто-то нажмет на ресет, выдернет шнур питания
а по рукам надавать? :)
специально пнет вилку от сервера
а по ногам? :)
-
Всем большое спасибо!
Решил делать с использованием переименовывания...