Интересно, а почему современные операционные системы не предоставляют возможности писать внутрь файла, раздвигая его? Т.е. запись в режиме insert, а не overwrite?
Полагаю, что все или почти все современные файловые системы могут поддерживать эту операцию с такой же лёгкостью, как и добавление данных в конец файла.
Или это не слишком часто нужно, и можно просто рассчитывать на то, что программа, которой это нужно, будет переписывать весь файл заново, как и происходит на практике?
Полагаю, что все или почти все современные файловые системы могут поддерживать эту операцию с такой же лёгкостью, как и добавление данных в конец файла.
Или это не слишком часто нужно, и можно просто рассчитывать на то, что программа, которой это нужно, будет переписывать весь файл заново, как и происходит на практике?
no subject
Date: 2004-06-16 04:16 am (UTC)Как ето не позволяют?
На любом языке такое можно написать
no subject
Date: 2004-06-16 04:20 am (UTC)no subject
Date: 2004-06-16 05:02 am (UTC)(no subject)
From:no subject
Date: 2004-06-16 04:23 am (UTC)no subject
Date: 2004-06-16 05:12 am (UTC)Но кому файлы с дырками нужны, более-менее понятно; кому нужен эффективный append, тоже понятно. Кому нужен insert? Не знаю :)
(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:Re: Reply to your comment...
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:Re: вас, конечно, не затруднит
From:Re: вас, конечно, не затруднит
From:Re: вас, конечно, не затруднит
From:Re: вас, конечно, не затруднит
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2004-06-16 07:27 am (UTC)Это дорого.
Date: 2004-06-16 04:23 am (UTC)Re: Это дорого.
Date: 2004-06-16 04:40 am (UTC)Хотя тогда, наверное, seek делать сложнее будет, и нужно добавлять больше информации куда-нибудь в управляющие структуры... да, надо подумать.
Re: Это дорого.
Date: 2004-06-16 04:49 am (UTC)Кстати, аналогичкая задача - откусовать кусочки от начала файла. Актуальна например при организации очереди. Один мой знакомый такое под DOS делал :-)).
Re: Это дорого.
From:Re: Это дорого.
From:(no subject)
From:Re: с такой же лёгкостью
Date: 2004-06-16 04:25 am (UTC)Вот добавление в начало файла - другое дело.
no subject
Date: 2004-06-16 04:33 am (UTC)no subject
Date: 2004-06-16 04:41 am (UTC)(no subject)
From:(no subject)
From:Unix files = suxx
From:Стыдно признаться...
Date: 2004-06-16 04:36 am (UTC)no subject
Date: 2004-06-16 04:44 am (UTC)В принципе, можно создать FS c возможностью вставки (с файлами, состоящими из записей различной длины). ЕМНИП, такая "файловая система" реализована в PalmOS.
Кстати, в стародавние времена, когда компьютеры были большие, а диски и оперативка - маленькие, существовало изящное решение этой задачки для частного случая текстового редактора (редактирующего текст много больше доступной RAM): начало текста (до текущей позиции) держалось в одном файле (в нормальном порядке), а хвост (от текущей позиции до конца текста) складывался в отдельный файл в обратном порядке. И при передвижении по файлу часть данных перекладывалась из одного файла в другой (из хвоста файла в хвост).
no subject
Date: 2004-06-16 05:53 am (UTC)Можно флаг файлу в INode давать, который будет говорить можноего инсерт или нет.
no subject
Date: 2004-06-16 05:56 am (UTC)Re: как частный случай insert'a
From:Re: как частный случай insert'a
From:Re: как частный случай insert'a
From:Re: как частный случай insert'a
From:Re: как частный случай insert'a
From:Re: как частный случай insert'a
From:no subject
Date: 2004-06-16 06:02 am (UTC)В смысле - когда этот пресловутый insert пойдет в ход в промышленых количествах, чем этот флаг будет отличаться от read-only прав доступа? :)
(no subject)
From:а поподробнее?
From:Re: а поподробнее?
From:Re: чего это именно
From:Re: чего это именно
From:Re: чего это именно
From:Re: чего это именно
From:Re: перестраховаться не вредно
From:no subject
Date: 2004-06-16 06:26 am (UTC)А на уровне реализации - это несколько отличается от дырок в файле, дырка не приводит к изменению логических смещений данных, которые находятся после дырки. А ваша операция требует именно такого изменения смещений. Как это сделать на величину, кратную размеру блока - понятно, но не очень интересно. Сделать это на произвольную величину - сложно и, наверное, может убить производительность.
А в базах данных обычно, насколько я знаю, делают те же индексно-последовательные файлы, только не на уровне ОС, а на уровне приложения.
no subject
Date: 2004-06-16 08:27 am (UTC)no subject
Date: 2004-06-16 09:05 am (UTC)(no subject)
From:Unix files = suxx
From:Не согласен
Date: 2004-06-16 05:48 pm (UTC)Операция "insert" является очень удобной для постоянного сохранения некой структуры на диск.
Например, мы хотим сохранять какой список при вставке новых элементов. Было бы очень удобно, чтобы эти элементы в файле лежали последовательно.
concurrent access
Date: 2004-06-16 09:25 am (UTC)более чем одним процессом, и такая операция инвалидирует смещения
других указателей чтения/записи. В двух словах API backward compatibility.
Дорого это...
Date: 2004-06-16 05:43 pm (UTC)В настоящее время файлы обычно лежат в виде последовательности блоков, отдельно хранится длина файла (дабы использовать только часть последнего блока, но не весь целиком).
Если же разрешить "вставку" в куда-то-в-файле, то появляется вопросы:
а) Как это сделать удобно?
б) Как это сделать быстро?
Вариант с копированием остатка файла и всем таким успешно реализуется в пользовательском приложении, а посему нет особого смысла реализовывать его в ОС.
Любой другой вариант - сделать своеобразные "дыры" в файле, хранить некий двусвязный список областей, хранить для каждого блока файла размер байт, которые в нем используются - слишком дорогие по времени.
1) "Дыры"
Примечание: описываемые "дыры" отличаются от "sparse"-файлов. Я говорю именно о "дырах", которые прячет ОС и никогда не показывает наверх.
Непонятно, где хранить "дыры", какие у них должны быть размеры и как ими управлять.
2) Список
Список опять же сказывается на производительности.
3) "Подблоки"
Выглядит интересно, но не очень. Потому что могут быть большие (очень большие) потери в остатках блоков.
********
Любой из этих примеров утыкается в производительность - при вставке блока надо будет перелопатить кучу информации и что-то где-то обновить.
Опять же, любая реализация запинается очень простыми сценариями:
1) Сценарий 1
Представим себе простенький файл на 1 Мб.
Мы начинаем вставлять по 1 Кб в цент файла. Причем каждый раз вставляем по смещению .5 Мб
2) Сценарий 2
Все тот же файл на 1 Мб.
Мы начинаем делать "insert" с конца файла в начало.
3) Сценарий 3
Файл 1 Мб.
Мы вставляем в центр файла (со смещения 0.5 Мб) блок размером 1 байт, 2 байта, 3 байта, 4 байта и так далее.
4) Сценарий 4
Наш любимый файл на 1 Мб.
Мы проигрываем сценарий 3, но после каждой вставки переписываем вставленный блок плюс по 1 Кб до и после оного.
***************
Сценарии можно продолжать и продолжать, для подавляющего большинства реализаций можно придумать свой сценарий "упадения".
Как только мы придумываем супер-пупер-алгоритм, сразу же вспоминаем, что файлы нынче идут не 1 Мб, а по 200-300 Мб в среднем, плюс видео и что-нибудь рабочее по 1 Гб. Если наш алгоритм все еще справляется с такими объемами, то запускаем алгоритм на файловом сервере.
В итоге приходим к выводу, что самое оптимальное - придумать свой специфичный алгоритм и реализовать его в своем же приложении.
Только почему-то кажется мне, что исследования на эту тему уже проводились и даже что-нибудь придумали.
Это все из-за "unix way"...
Замечу, что ВСЕХ этих проблем не было даже в OS/360 1968 (!) года выпуска и во всех последующих OS для IBM Manframe.
Re: Это все из-за "unix way"...
Date: 2004-06-16 09:27 pm (UTC)Собственно, мне как раз неюниксовый подход и не нравился - замучаешься открывать файл: операция простая, а чихать надо много и часто для получения конечного результата - создай контрольный блок, позови пятнадцать сисколлов, потом, пожалуй, и файл давайте откроем. Мне это до сих пор кажется муторным. Практическая польза тоже спорна - файловая система должна поддерживать, VMM должна поддерживать, реализация относительно сложная и рассадник багов, а реально нужно только полутора приложениям, тем более что та же RDBMS всё равно потребует себе выделенного тома, и этот том внутри перекроит как ей надо и будет работать с ним по-своему.
Re: Это все из-за "unix way"...
From: