Задача такая:
Хочу создать кеш доступа к мелким объектам (10-100КБ), чтобы не обращаться к куче мелких файлов.
Объектов будет оч. много (возможно миллионы) и хранение их прямо в базе данных думаю что загнет любую БД.
Хочу использовать для этого разряженный файл, отдельно в БД хранить с какого по какой байт в файле данные уже не нужны и собственно файл кеша, в котором по мере устаревания будут "стираться" части файлов.
Собственно вопрос — как средствами .NET можно сделать в файле "дырку" в нужном месте.
Желательно кросс-платформенная реализация (прога будет работать на Windows и Linux).
Сражение выигрывает тот, кто твердо решил его выиграть
(с) Л.Н. Толстой
Здравствуйте, NovaCxarmulo, Вы писали:
NC>Задача такая: NC>Хочу создать кеш доступа к мелким объектам (10-100КБ), чтобы не обращаться к куче мелких файлов. NC>Объектов будет оч. много (возможно миллионы) и хранение их прямо в базе данных думаю что загнет любую БД.
Люди годами взращивают БД, так что стоит сначала в эту сторону поглубже копнуть, тесты, может, сделать. Есть бооооольшие сомнения, что трудозатраты на кэш, работающий лучше БД, себя окупят
Здравствуйте, NovaCxarmulo, Вы писали:
NC>Задача такая: NC>Хочу создать кеш доступа к мелким объектам (10-100КБ), чтобы не обращаться к куче мелких файлов. NC>Объектов будет оч. много (возможно миллионы) и хранение их прямо в базе данных думаю что загнет любую БД.
миллион это не то число которое прям так сразу загнет любую базу
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Здравствуйте, NovaCxarmulo, Вы писали:
NC>Здравствуйте, игппук, Вы писали:
И>>дырка — это могеж быть последовательность нулей, к примеру. а зачем делать дырку то? без нее нельзя?
NC>дырка нужна чтобы не занималось дискогое пространство — объектов могут быть миллионы и они будут меняться.
Я правильно понял, что вы хотите сделать так, чтобы при записи в файл нескольких кусков по смещениям
S1 .. F1;
S2 .. F2;
...
SN .. FN,
диапазоны файла между записанными кусками (F1 .. S2, F2 .. S3, ...) отдавались файловой системе, чтобы не занимать дискового пространства?
Если не правильно, опишите, пожалуйста то, что вы понимаете под дыркой в файле.
Здравствуйте, samius, Вы писали:
S>Здравствуйте, NovaCxarmulo, Вы писали:
NC>>Здравствуйте, игппук, Вы писали:
И>>>дырка — это могеж быть последовательность нулей, к примеру. а зачем делать дырку то? без нее нельзя?
NC>>дырка нужна чтобы не занималось дискогое пространство — объектов могут быть миллионы и они будут меняться.
S>Я правильно понял, что вы хотите сделать так, чтобы при записи в файл нескольких кусков по смещениям S>S1 .. F1; S>S2 .. F2; S>... S>SN .. FN, S>диапазоны файла между записанными кусками (F1 .. S2, F2 .. S3, ...) отдавались файловой системе, чтобы не занимать дискового пространства?
S>Если не правильно, опишите, пожалуйста то, что вы понимаете под дыркой в файле.
Да правильно, причем не только при первоначальной записи, но и потом чтобы в процессе устаревания данных можно было бы такие дырки делать в уже существующем файле.
Сражение выигрывает тот, кто твердо решил его выиграть
(с) Л.Н. Толстой
Здравствуйте, NovaCxarmulo, Вы писали:
NC>Да правильно, причем не только при первоначальной записи, но и потом чтобы в процессе устаревания данных можно было бы такие дырки делать в уже существующем файле.
Боюсь, что вам надо обратиться на форум разработчиков файловых систем и объяснить им, как вам сильно нужны дырки в файлах
И надо будет подкинуть им идею о том, как будет происходить адресация в таких файлах.
З.Ы. Пишите свои файлы либо в BLOB поля, либо прямо на диск (только не в один каталог!) и будет вам счастье! Про дырки в файлах никому не говорите на работе, боюсь, что не оценят идею.
Здравствуйте, Lloyd, Вы писали:
L>Здравствуйте, samius, Вы писали:
S>>Про дырки в файлах никому не говорите на работе, боюсь, что не оценят идею.
L>Про sparse-файлы не слышали?
Нет. Читаю.
Здравствуйте, samius, Вы писали:
S>Здравствуйте, NovaCxarmulo, Вы писали:
NC>>Да правильно, причем не только при первоначальной записи, но и потом чтобы в процессе устаревания данных можно было бы такие дырки делать в уже существующем файле.
S>Боюсь, что вам надо обратиться на форум разработчиков файловых систем и объяснить им, как вам сильно нужны дырки в файлах S>И надо будет подкинуть им идею о том, как будет происходить адресация в таких файлах.
S>З.Ы. Пишите свои файлы либо в BLOB поля, либо прямо на диск (только не в один каталог!) и будет вам счастье! Про дырки в файлах никому не говорите на работе, боюсь, что не оценят идею.
2 NovaCxarmulo
Прошу прощения, погорячился с советами
Здравствуйте, TK, Вы писали:
TK>Здравствуйте, NovaCxarmulo, Вы писали:
NC>>Задача такая: NC>>Хочу создать кеш доступа к мелким объектам (10-100КБ), чтобы не обращаться к куче мелких файлов. NC>>Объектов будет оч. много (возможно миллионы) и хранение их прямо в базе данных думаю что загнет любую БД.
TK>миллион это не то число которое прям так сразу загнет любую базу
миллион это число объектов, а не строк таблицы... 100КБ * 1 млн это примерно 100Гб...
нужен кеш для хранения мелких файлов на сервере виртуального хостинга кеш будет использоваться для регулярной проверки содержимого файлов, чтобы не нагружать диск лишними операциями поиска мелких файлов.
Сражение выигрывает тот, кто твердо решил его выиграть
(с) Л.Н. Толстой
Здравствуйте, Lloyd, Вы писали:
L>Здравствуйте, samius, Вы писали:
S>>Про дырки в файлах никому не говорите на работе, боюсь, что не оценят идею.
L>Про sparse-файлы не слышали?
Спасибо за информацию — не знал как они правильно называются, поэтому не мог найти инфу.
Здравствуйте, Lloyd, Вы писали:
L>Здравствуйте, samius, Вы писали:
S>>Про дырки в файлах никому не говорите на работе, боюсь, что не оценят идею.
L>Про sparse-файлы не слышали?
Нашел утилиту коммандной строки fsutil — с её помощью можно как сделать файл разряженным, так и пометить в уже существующем файле разрященные области, в прямых вызовах API решил пока не копаться — этот вариант меня вполне устраивает.
Остается вопрос — как реализовать тоже самое в Linux.
Задача: есть файл и в нем (уже существующем) нужно сделать "дырку".
Сражение выигрывает тот, кто твердо решил его выиграть
(с) Л.Н. Толстой
Здравствуйте, NovaCxarmulo, Вы писали:
NC>Здравствуйте, Lloyd, Вы писали:
L>>Здравствуйте, samius, Вы писали:
S>>>Про дырки в файлах никому не говорите на работе, боюсь, что не оценят идею.
L>>Про sparse-файлы не слышали?
NC>Нашел утилиту коммандной строки fsutil — с её помощью можно как сделать файл разряженным, так и пометить в уже существующем файле разрященные области, в прямых вызовах API решил пока не копаться — этот вариант меня вполне устраивает.
NC>Остается вопрос — как реализовать тоже самое в Linux. NC>Задача: есть файл и в нем (уже существующем) нужно сделать "дырку".
Здравствуйте, NovaCxarmulo, Вы писали: NC>нужен кеш для хранения мелких файлов на сервере виртуального хостинга кеш будет использоваться для регулярной проверки содержимого файлов, чтобы не нагружать диск лишними операциями поиска мелких файлов.
Крайне рекомендую собраться с мыслями и рассказать здесь, какую именно задачу хочется решить. Вполне возможно, что вы реализуете не то решение.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
NC>миллион это число объектов, а не строк таблицы... 100КБ * 1 млн это примерно 100Гб...
100 Гб тоже не предел.
Для таких гиганотов как Oracle или Sybase (эти вообще затачивали под большущие обьемы) эт не проблема.
-----------------------------------------
тут может быть ваша реклама
Здравствуйте, Pavel M., Вы писали:
PM>Обоснуйте, почему разряженный файл на 100 гигабайт и Ваша система кеша будет работать быстрее БД? Ну, пару аргументов?
PM>
Велосипедист обыкновенный Все программисты в начале своего пути считают себя умнее разработчиков ФС, СУБД, ОС и т.д., и уверены, что их велосипеды будут работать лучше... Это пройдёт
Здравствуйте, nauro, Вы писали:
NC>>миллион это число объектов, а не строк таблицы... 100КБ * 1 млн это примерно 100Гб... N>100 Гб тоже не предел. N>Для таких гиганотов как Oracle или Sybase (эти вообще затачивали под большущие обьемы) эт не проблема.
Здравствуйте, NovaCxarmulo, Вы писали:
NC>Собственно вопрос — как средствами .NET можно сделать в файле "дырку" в нужном месте. NC>Желательно кросс-платформенная реализация (прога будет работать на Windows и Linux).
В UNIX'е чтобы сделать в файле дырку, надо сделать lseek() вперед, за конец файла, а потом что-нибудь записать. Тогда пространство между старым концом файла и началом новой записи будет дыркой.
Обратите внимание, в UNIX вы не можете пробить дырку в середине существующего файла, вы можете лишь дописать дырку плюс данные в хвост. В венде не знаю, мне лениво это читать
В общем и целом, ваша идея не кажется мне очень уж хорошей. Во-первых, у меня нет уверенности, что базы данных так уж плохо работают с BLOB'ами. Я бы попробовал для начала. Во-вторых, если уж хранить BLOB'ы в отдельном файле, я бы выделял пространство в этом файле кусками, а в базе хранил бы ссылки на эти куски. В таком случае, вам не нужны дырки, т.к. вы заполните их при следующем выделении. В-третьих, sparse files будут вести себя неожиданно в ряде случаев. Например, если вы скопируете такой файл, велика вероятность, что дырки "зарастут", и станут настоящими блоками, заполненными нулями.