|
|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Vyacheslav Ignatyuk 2:5020/400 25 Oct 2000 01:27:44 To : All Subject : Re: Symbol::gensym() -------------------------------------------------------------------------------- "Roman Chumakov" <zfido88@zr.ru> wrote in message news:8t4k7q$u0p$1@gavrilo.mtu.ru... > При использовании сабжа для открытия файлов , после, где-то, 2-х миллионов > открытий-закрытий кончились иноды :( > Сообщение на системной консоли такое: > Oct 24 19:34:29 wwwu /kernel: pid 61218 (vi), uid 0 on /: out of inodes > FreeBSD-4.1.1 256Mb памяти > > Суть действий выполнявшегося скрипта такая: > 1. открыть очередной (новый) файл. > 2. Поставить lock на него > 3. Записать данные > 4. Снять lock > 5. Закрыть файл > (6. Перейти на шаг 1.) > > > my $froot = "./filebase/"; > for($i1=0;$i1<20;$i1++){ > for($i2=0;$i2<20;$i2++){ > for($i3=0;$i3<20;$i3++){ > for($f=0;$f<1000;$f++){ > my $dir = $froot . "$i1/" . "$i2/" . "$i3/"; > my $fn = $dir . "$f.htm"; > my $text = "<html><body>$f</body></html>"; > mkpath( $dir ); > my $fh = Symbol::gensym(); > open ($fh,">${fn}") || die "Cannot open file ${fn} for writing"; Совершенно незачем применять Symbol::gensym() в данном случае. Убери my $fh = Symbol::gensym() и замени везде $fh на FH и.... насладись аналогичным результатом ;-)) Hаплодил ты огромное количество мелких файлов - вот и кончились эти самые inods. Также непонятны локи - у тебя что - конкурентный доступ к ним? К такому количеству файлов? И неплохо разбить на поддиректории для более быстрого доступа. Ведь директория - тоже файл ;-) Маленький файл, даже если содержит один байт, занимает на диске как минимум блок. У тебя что-то с идеологией и логикой работы не совсем хорошо. Так же как объявление my переменных в теле цикла. А не лучше ли их определить до первого оператора for? malloc и free хорошо - но зачем? Если тебе надо оперировать с таким большим количеством файлов, то не лучше ли все их засунуть в один файл и все это как-то индексировать. Если размеры файлов не отличаются на порядки (что видно из текста), то можно организовать записи как fixed length - все одно потери не будут больше, скорее меньше. Или используй DB_File для хранения содержимого файлов как записей. К тому же моему скудному уму не доступен случай, когда требуется такое количество файлов, да к тому же сгенерированных автоматически. Может их лучше создавать и отдавать на лету по требованию? Так что лучше бы спрашивал, как сделать не так как ты это сделал. Ты забыл рассказать всем - а для чего это все? > Видимо я неправильно использую Symbol::gensym() > А как-же его использовать, чтобы иноды не кончились? Правильно, но не в тему. Лучше почитай что нибудь на тему UFS. Для аналогичных случаев подошла бы ReiserFS, но не для FreeBSD ;-) Все на журналировании зациклились, но не это главное... > > Спасибо. > Роман. Vyacheslav Ignatyuk -- Отправлено через сервер Talk.Ru - http://www.talk.ru --- ifmail v.2.15dev5 * Origin: Talk.Ru (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/6488203e70cc.html, оценка из 5, голосов 10
|