avva: (Default)
[personal profile] avva
Интересно, а почему современные операционные системы не предоставляют возможности писать внутрь файла, раздвигая его? Т.е. запись в режиме insert, а не overwrite?

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

Или это не слишком часто нужно, и можно просто рассчитывать на то, что программа, которой это нужно, будет переписывать весь файл заново, как и происходит на практике?
Page 1 of 3 << [1] [2] [3] >>

Date: 2004-06-16 04:16 am (UTC)
From: [identity profile] tangodancer.livejournal.com
я тебя правильно понял?????
Как ето не позволяют?
На любом языке такое можно написать

Date: 2004-06-16 04:20 am (UTC)
From: [identity profile] avva.livejournal.com
Как?

Date: 2004-06-16 04:23 am (UTC)
From: [identity profile] sobaker.livejournal.com
Операциями перезаписи. Раздвинуть нельзя на уровне FS нельзя.

Это дорого.

Date: 2004-06-16 04:23 am (UTC)
From: [identity profile] potan.livejournal.com
Если сдвиг идет не на целое счисло блоков - то все-равно придется переписывать, пусть и в нутри драйвера. Даже если на целое - будет увеличено количество фрагментов, что тоже не есть хорошо.

Re: с такой же лёгкостью

Date: 2004-06-16 04:25 am (UTC)
From: [personal profile] alll
Насчет легкости - это сильно сказано. Все-таки файловые системы так или иначе оперируют блоками, а не отдельными байтами. Так что получится либо морока несусветная (одна "сборка мусора" чего будет стоить), либо то же самый overwrite, только спрятаный от программиста и оттого труднопредсказуемый.

Вот добавление в начало файла - другое дело.

Date: 2004-06-16 04:33 am (UTC)
From: [identity profile] aeriman.livejournal.com
Операционные системы типа *nix позволяют. Для этого даже примитивы в stdlib есть. Дело в том, что это ОЧЕНЬ медленная операция, всё равно связанная с overwrite.

Стыдно признаться...

Date: 2004-06-16 04:36 am (UTC)
From: [identity profile] dimrub.livejournal.com
Я, если честно, на Longhorn еще совсем не смотрел. Может, там такое будет?

Re: Это дорого.

Date: 2004-06-16 04:40 am (UTC)
From: [identity profile] avva.livejournal.com
Мне казалось, что современные файловые системы уже все умеют более эффективно использовать блоки. Например, использовать только часть блока для содержимого файла, а потом прыгать на следующий блок (если вообще организовывать дисковое пространство, разбивая его на блоки). Например, я знаю, что reiserfs умеет в один "блок" писать много маленьких файлов - почему же тогда нельзя в середине файла использовать часть блока, а не целый?

Хотя тогда, наверное, seek делать сложнее будет, и нужно добавлять больше информации куда-нибудь в управляющие структуры... да, надо подумать.

Date: 2004-06-16 04:41 am (UTC)
From: [identity profile] avva.livejournal.com
Какие примитивы?

Date: 2004-06-16 04:44 am (UTC)
From: [identity profile] aamonster.livejournal.com
Потому что современные файловые системы на это не рассчитаны: файл хранится в виде блоков (кластеров) фиксированного размера, и если вставляется не целое число кластеров - придется переписывать весь конец файла...

В принципе, можно создать FS c возможностью вставки (с файлами, состоящими из записей различной длины). ЕМНИП, такая "файловая система" реализована в PalmOS.

Кстати, в стародавние времена, когда компьютеры были большие, а диски и оперативка - маленькие, существовало изящное решение этой задачки для частного случая текстового редактора (редактирующего текст много больше доступной RAM): начало текста (до текущей позиции) держалось в одном файле (в нормальном порядке), а хвост (от текущей позиции до конца текста) складывался в отдельный файл в обратном порядке. И при передвижении по файлу часть данных перекладывалась из одного файла в другой (из хвоста файла в хвост).

Re: Это дорого.

Date: 2004-06-16 04:49 am (UTC)
From: [identity profile] potan.livejournal.com
По моему недозаполненное пространство в блоке reiserfs использует только если маленький файл помещается туда целиком. Но иметь в середине файла невыровненную на границу блока цепочку точно не позволяет.

Кстати, аналогичкая задача - откусовать кусочки от начала файла. Актуальна например при организации очереди. Один мой знакомый такое под DOS делал :-)).

Date: 2004-06-16 04:58 am (UTC)
From: [identity profile] aeriman.livejournal.com
Пардон лажанулся, не stdlib, а stdio
int fseek(FILE *, long, int);
int fsetpos(FILE *, const fpos_t *);
long ftell(FILE *);
size_t fwrite(const void * __restrict, size_t, size_t, FILE * __restrict);

Date: 2004-06-16 05:02 am (UTC)
From: [identity profile] tangodancer.livejournal.com
zapomni vse ot nachala tvoego kursora do konca faila-i vpered.eto zhe prosto

Date: 2004-06-16 05:02 am (UTC)
From: [identity profile] avva.livejournal.com
Это всё другое, эти функции позволяют писать поверх существующих данных, а не вставлять, раздвигая.

Date: 2004-06-16 05:03 am (UTC)
From: [identity profile] avva.livejournal.com
Нет, я не об этом.

Re: Это дорого.

Date: 2004-06-16 05:06 am (UTC)
From: [identity profile] avva.livejournal.com
Любопытно, однако, насколько такое ограничение навязано структурами данных reiserfs. Может быть, его легко было бы убрать. Ещё один фактор "против" этого (против незаполненного блока в середине файла), кстати - что неудобно тогда делать эффективный mmap().

Date: 2004-06-16 05:12 am (UTC)
nine_k: A stream of colors expanding from brain (Default)
From: [personal profile] nine_k
Нетрудно вообразить FS, которая умела бы такую операци. эффективно поддерживать. Умеют же FS поддерживать файлы с "дырками".

Но кому файлы с дырками нужны, более-менее понятно; кому нужен эффективный append, тоже понятно. Кому нужен insert? Не знаю :)

Date: 2004-06-16 05:22 am (UTC)
From: [identity profile] avva.livejournal.com
Полагаю, что базам данных пригодился бы.
Возможно, другим программам, работающим с очень большими файлами, например, видео-редакторам.

Date: 2004-06-16 05:36 am (UTC)
From: [identity profile] dimrub.livejournal.com
Базам данных - пожалуй, что нет. Они работают либо с fixed length fields, либо с блобами, на которых такие операции никто, наверное, не производит.

Возможно, XSLT такой in-place editing был бы кстати.

Date: 2004-06-16 05:53 am (UTC)
From: [identity profile] lazha.livejournal.com
Ого, мне идея нравится.
Можно флаг файлу в INode давать, который будет говорить можноего инсерт или нет.

Date: 2004-06-16 05:55 am (UTC)
From: [identity profile] lazha.livejournal.com
Ретроактивные логи.
Текстовики, например xml-word документ.

Date: 2004-06-16 05:56 am (UTC)
From: [identity profile] lazha.livejournal.com
Кстати - append - получается как частный случай insert'a.

Date: 2004-06-16 06:02 am (UTC)
From: [personal profile] alll
А если нельзя, то что?
В смысле - когда этот пресловутый insert пойдет в ход в промышленых количествах, чем этот флаг будет отличаться от read-only прав доступа? :)

Date: 2004-06-16 06:06 am (UTC)
From: [identity profile] lazha.livejournal.com
Backwards compatibility.

а поподробнее?

Date: 2004-06-16 06:09 am (UTC)
From: [personal profile] alll
с чем именно compatibility? С теми, кто не умеет делать insert? Так они и так его не смогут сделать - хоть будет флаг, хоть нет.
Page 1 of 3 << [1] [2] [3] >>

December 2025

S M T W T F S
  123 4 56
78 9 10 11 1213
1415 1617181920
21 22 23 24 2526 27
2829 30 31   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 2nd, 2026 10:52 am
Powered by Dreamwidth Studios