serzh-z, это обсуждали давно, уже, много раз...
то что я нашел:
если тебе еще нужно все картикни отдать сразу, то ядро не выдержит большое количество открытых файлов, кроме ФС...
на счет фс: есть ZFC на FreeBSD самая лучшая
есть решение: MogileFS c репликацией Master -> Slave
и отадача через nginx, как статику...
MogileFS - open source distributed filesystem
Распределенная файловая система созданная в рамках проекта LiveJournal и реализованная на уровне многоплатформенного приложения на Perl.
Присутствуют операции создания файла (путь к файлу представляет собой множество ключей в рамках заданных доменов, информация о файлах хранится в MySQL базе) и его чтения (т.е. пригодна для решения задач, когда нужно один раз создать файл, а потом многократно его читать, модификация файла производится только путем полной перезаписи).
Для каждого файла задается его класс, определяющий на какое число соседних машин от будет реплицирован. Отлично подходит для создания распределенных web-проектов и как средство создания высоконадежного хранилища данных, не прибегая к использованию RAID. Доступ пользовательских приложений к ФС осуществляется посредством HTTP запросов (PUT/GET) или через использования виртуального NFS тома.
Perlbal - система балансировки нагрузки на Perl, представленная на том же сайте. Отличный пример как нужно писать высокопроизводительные приложения на Perl.
http://www.danga.com/mogilefs/
еще, PostgreSQL,MSSQl, Oracle умеют хранить файлы
в MSSQl, Oracle даже есть тип данных для стримминга:
в документации в PostgreSQL написано, что она может хранить фотографии, музыку и видео
Example: Streaming character data from the database
In this example, we demonstrate a technique for streaming data from the database to a file handle, in this case STDOUT. This allows more data to be read in and written out than could be stored in memory at a given time.
Код: Выделить всё
my $lob_id = 17; # Arbitrary row identifier, for example
$sth = $dbh->prepare( <<" SQL", { ora_auto_lob => 0 } );
SELECT chardata
FROM lob_example
WHERE lob_id = ?
SQL
$sth->execute( $lob_id );
my ( $char_locator ) = $sth->fetchrow_array();
my $chunk_size = 1034; # Arbitrary chunk size, for example
my $offset = 1; # Offsets start at 1, not 0
while(1) {
my $data = $dbh->ora_lob_read( $char_locator, $offset, $chunk_size );
last unless length $data;
print STDOUT $data;
$offset += $chunk_size;
}
Notice that the select statement does not contain the phrase "FOR UPDATE". Because we are only reading from the LOB Locator returned, and not modifying the LOB it refers to, the select statement does not require the "FOR UPDATE" clause.
A word of catution when using the data retruned from an ora_lob_read in a condtional statement. for example if the code below;
Код: Выделить всё
while( my $data = $dbh->ora_lob_read( $char_locator, $offset, $chunk_size ) ) {
print STDOUT $data;
$offset += $chunk_size;
}
was used with a chunk size of 4096 against a blob that requires more than 1 chunk to return the data and the last chunk is one byte long and contains a zero (ASCII 48) you will miss this last byte as $data will contain 0 which PERL will see as false and not print it out.
http://search.cpan.org/~pythian/DBD-Oracle...om_the_database
в PostgreSQL написанно, что спокойно может хранить фото, видео, аудио, ну и смотреть видео, аудио это прямо из базы
только для отдачи по httpd, нужно будет писать модуль к nginx
есть seek:
lo_lseek
Код: Выделить всё
$loc = $dbh->pg_lo_lseek($lobj_fd, $offset, $whence);
Changes the current read or write location on the large object $obj_id. Currently $whence can only be 0 (which is L_SET). Returns the current
location and undef upon failure. This function cannot be used if AutoCommit is enabled.
к MySQL есть какое-то дополнение:
http://blobstreaming.org/