На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила трёх "С"
Пожалуйста,
1. Соблюдайте правила Форума.
2. Слушайте советы Модераторов.
(например, http://forum.sources.ru/index.php?act=ST&f=7&t=80382 )
3. Сверяйтесь с учебником по Великому и Могучему
  
> Обработка больших файлов
    Уважаемые господа!

    Может быть кто подскажет как работать с большими файлами (порядка 20Gb). Обычные файловые функции не работают или работают но не так.  

    Меня устроит и С/C++, и Free Pascal,  и Perl. Обработка файлов нужна под Линакс (ext3)

    Пожалуйста, помогите!

    P.S. В форуме C/C++ спрашивал - пока никто не ответил :(

      если включить
      #define _LARGEFILE64_SOURCE 1
      то loff_t должен стать 64 битным (т.е. long long), это даст возможность делать lseek64 за пределы 2G, это все справедливо для block devices, на простых файлах не пробовал.
      Но это легко проверить до написания прог, надо глянуть драйверы ext3, и проверить размерность loff_t в реализации seek.
        Цитата bin, 20.06.02, 12:31:34
        если включить
        #define _LARGEFILE64_SOURCE 1
        то loff_t должен стать 64 битным (т.е. long long), это даст возможность делать lseek64 за пределы 2G, это все справедливо для block devices, на простых файлах не пробовал.
        Но это легко проверить до написания прог, надо глянуть драйверы ext3, и проверить размерность loff_t в реализации seek.


        Извиняюсь. Я уже нашел это и отписАл в форуме по Ц++

        ===

        #define __USE_FILE_OFFSET64
        #define __USE_LARGEFILE
        #define __USE_LARGEFILE64

        для хранения размеров, смещений и прчего использовать off_t

        ===

        Все заработало. Теперь бэкапы скручиваются "на ура" в файл 23G ;) Tar так не может!

        ... или может?
          лехко.

          #!/usr/bin/perl

          if ((scalar @ARGV) != 1)
          {
          print "use: mlogpars.pl file_mail_logs\n";
          exit 1;
          }

          my $c_fn_mlog = $ARGV[0];
          my @a_mlog;

          open(F_ML, "$c_fn_mlog");
          @a_mlog = <F_ML>;
          close(F_ML);

          my $i_cnt = 0;
          my $i_old;
          my (@a_buf, @a_buf1, $a_mlog, $c_date, $c_to_uid, $c_from_uid, $i_size, $i_msg_num);

          $| = 1;

          while ($i_cnt < scalar(@a_mlog))
          {
          $a_mlog = @a_mlog[$i_cnt];
          $a_mlog =~ s/\r//g;
          $a_mlog =~ s/\n//g;
          @a_buf = split (/ +/, $a_mlog);





          etc.
          это часть парса логов.
          лог был на сколько помнится гиг 30.
          kernel 2.4.18.
            Цитата lamo, 20.06.02, 16:24:15
            лехко.

            #!/usr/bin/perl

            if ((scalar @ARGV) != 1)
            {
            print "use: mlogpars.pl file_mail_logs\n";
            exit 1;
            }

            my $c_fn_mlog = $ARGV[0];
            my @a_mlog;

            open(F_ML, "$c_fn_mlog");
            @a_mlog = <F_ML>;
            close(F_ML);

            my $i_cnt = 0;
            my $i_old;
            my (@a_buf, @a_buf1, $a_mlog, $c_date, $c_to_uid, $c_from_uid, $i_size, $i_msg_num);

            $| = 1;

            while ($i_cnt < scalar(@a_mlog))
            {
            $a_mlog = @a_mlog[$i_cnt];
            $a_mlog =~ s/\r//g;
            $a_mlog =~ s/\n//g;
            @a_buf = split (/ +/, $a_mlog);





            etc.
            это часть парса логов.
            лог был на сколько помнится гиг 30.
            kernel 2.4.18.


            Как-то подозрительно это все ;) У меня ядро 2.4.7-10 если не ошибаюсь. Я еще раз попробовал:

            1) -f на файл в 23Gb возвращает 0
            2) stat возвращает размер файла undef
            3) на маленьких файлах - все как положено

            так что легко??? и tar у тебя нормально на таких размерах пашет? Поверять нужно так - не на размер создаваемого таром файла смотри, а попробуй "достать" не битый файл.

            Кстати, мене интереснее как ты сможешь сделать seek на гиг так 11-12? Покажи работающий перловый код.

            И еще...Может чего в в ядре добавили за это время?
            У тебя ядро то по-новее будет.

              Цитата lamo, 20.06.02, 16:24:15
              лехко.

              #!/usr/bin/perl

              if ((scalar @ARGV) != 1)
              {
              print "use: mlogpars.pl file_mail_logs\n";
              exit 1;
              }

              my $c_fn_mlog = $ARGV[0];
              my @a_mlog;

              open(F_ML, "$c_fn_mlog");
              @a_mlog = <F_ML>;
              close(F_ML);

              my $i_cnt = 0;
              my $i_old;
              my (@a_buf, @a_buf1, $a_mlog, $c_date, $c_to_uid, $c_from_uid, $i_size, $i_msg_num);

              $| = 1;

              while ($i_cnt < scalar(@a_mlog))
              {
              $a_mlog = @a_mlog[$i_cnt];
              $a_mlog =~ s/\r//g;
              $a_mlog =~ s/\n//g;
              @a_buf = split (/ +/, $a_mlog);





              etc.
              это часть парса логов.
              лог был на сколько помнится гиг 30.
              kernel 2.4.18.


              Стоп-стоп-стоп.  >:( Ты "гонишь". 30Gb этот код не обработает... Я позволю себе коментарии расставить!
              ExpandedWrap disabled
                <br># взяли из командной строки имя обрабатываемого файла<br>my $c_fn_mlog = $ARGV[0];<br><br># определили массив<br>my @a_mlog;<br><br># открыли файл для чтения (а проверять кто будет?)<br># правильнее было бы так:<br>#<br># open(F_ML, "$c_fn_mlog") || die "Shit happiness!";<br>#<br>#<br>open(F_ML, "$c_fn_mlog");<br><br># опаньки !!! загоняем построчно весь файл в 30G в память!!!!!!!!!! <br>@a_mlog = <F_ML>;<br><br># типа хотим еще чего-то закрыть<br>close(F_ML);<br>


              Какие 30G ???
                опс.
                23 мега.
                а с перепою показалось гиг )
                  про проверки ипроч ...
                  задача тривиальная и разовая.
                  писалось все на коленке с жесточайшего похмелья
                  за пять мин.
                  и сразу забылось )

                  а про 30 гиг - интересно.
                  правда никогда такой задачи не было.
                  4 гига было.
                  найду сырц - скину.
                    Цитата lamo, 21.06.02, 13:43:25
                    про проверки ипроч ...
                    задача тривиальная и разовая.
                    писалось все на коленке с жесточайшего похмелья
                    за пять мин.
                    и сразу забылось )

                    а про 30 гиг - интересно.
                    правда никогда такой задачи не было.
                    4 гига было.
                    найду сырц - скину.


                    Я не говорю что проверки - нечто экзотическое. Эт-так, просто на файлах в 30G это спасает ;) от дополнительной головной боли в тяжкие времена похмелья.  ;D ;D ;D

                    А вот если сырец найдешь - будет очень даже замечательно. Проблему-то я решил, но на Ц++. А вот если бы Перл'овкой все сделать ... Уважаю я Перл, а так досадно даже как-то  ;D ;D ;D
                    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                    0 пользователей:


                    Рейтинг@Mail.ru
                    [ Script execution time: 0,0263 ]   [ 15 queries used ]   [ Generated: 26.04.24, 09:52 GMT ]