|
|
|
| Что происходит быстрее - запись в файл или копирование файла (размер одинаковый)?
Задача обновить информацию в файле как можно быстрее. Стоит ли писать прямо в этот файл или лучше создавать рядышком временной файл, записывать в него, а потом, когда он будет готов - copy(); ? | |
|
|
|
|
|
|
|
для: Shorr Kan
(11.03.2006 в 17:28)
| | Боюсь в каждом конкретном случае следует измерять скрость по новой. Ведь алгоритмы системных вызвов в каждой операционной системе свои, плюс ко всему у каждой операционной системы несколько файловых систем. Мне кажется, что вариант с copy() будет работать быстрее в большинстве случаев. | |
|
|
|
|
|
|
|
для: Shorr Kan
(11.03.2006 в 17:28)
| | Может лучше создавать рядышком временной файл, записывать в него, а потом, когда он будет готов - unlink(); rename(); ? | |
|
|
|
|
|
|
|
для: Trianon
(12.03.2006 в 15:50)
| | Это ж явно будет дольше любого варианта, из предложенных мной. | |
|
|
|
|
|
|
|
для: Shorr Kan
(12.03.2006 в 19:02)
| | unlink(); rename(); дольше copy() ?
Почему? | |
|
|
|
|
|
|
|
для: Trianon
(12.03.2006 в 20:16)
| | Две операции, вместо одной. | |
|
|
|
|
|
|
|
для: Shorr Kan
(13.03.2006 в 09:55)
| | А то, что rename - операция атомарная, и выполняется мгновенно, А copy - это целая процедура, время работы которой, грубо говоря, пропорционально размеру файла, это Вы в расчет не берете? | |
|
|
|
|
|
|
|
для: Trianon
(13.03.2006 в 10:08)
| | Не беру, ведь мне это неизвестно. Поделитесь подробностями, раз вы в курсе. | |
|
|
|
|
|
|
|
для: Shorr Kan
(13.03.2006 в 15:30)
| | Операции переименования и удаления не работают непосредственно с даннами, только с таблицей FAT. Причем, операция удаления должна быть даже более быстрой чем переименования, так как в имени файла изменяется всего один символ:) | |
|
|
|
|
|
|
|
для: Shorr Kan
(13.03.2006 в 15:30)
| | Какими?
Чтобы скопировать файл, нужно открыть один файл, создать второй. А затем в цикле пока данные в первом файле не кончатся, читать данные из первого файла, и распределяя по ходу дела дисковое пространство, записывать их во второй. Потом оба файла закрыть.
Чтобы переименовать файл, нужно... обновить запись в каталоге, заменив в ней имя.
Все это конечно весьма грубо и многих тонкостей не учитывает, но разницу в сложности процессов позволяет рассмотреть. | |
|
|
|
|
|
|
|
для: Trianon
(13.03.2006 в 16:01)
| | Позволяет. Значит, наиболее быстрый вариант - создание временного файла, затем удаление настоящего и переименование? А нужно ли делать удаление - ведь достаточно переименовать временной в то же имя, что и настоящий...
И как защититься от запроса к несуществующему файлу? Ведь таковой запрос действительно может поступить между unlink и rename. | |
|
|
|
|
|
|
|
для: Shorr Kan
(13.03.2006 в 17:20)
| | А как Вы защищались от запроса к файлу в момент, когда выполняется copy() ? | |
|
|
|
|
|
|
|
для: Trianon
(13.03.2006 в 18:02)
| | Я не защищался, поэтому и спрашиваю - можно ли это сделать?
[поправлено модератором] | |
|
|
|
|
|
|
|
для: Shorr Kan
(13.03.2006 в 21:38)
| | Если запрос к файлу идет не через Ваш скрипт - практически невозможно. Можно лишь пытаться сокращать вероятность попадания запроса в этот интервал.
Если через Ваш - можно, но сложно, долго и муторно. Нужно будет как-то организовывать критическую секцию в ветках выполнения запросов. Насколько вероятна такая ситуация, и самое главное - насколько она кошмарна? Что будет, если запрос не обнаружит файла? | |
|
|
|