Главная страница


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)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Symbol::gensym()   Roman Chumakov   24 Oct 2000 22:26:35 
 Re: Symbol::gensym()   Vyacheslav Ignatyuk   25 Oct 2000 01:27:44 
Архивное /ru.perl/6488203e70cc.html, оценка 3 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional