Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.137.221.163] |
|
Сообщ.
#1
,
|
|
|
Уважаемые господа!
Может быть кто подскажет как работать с большими файлами (порядка 20Gb). Обычные файловые функции не работают или работают но не так. Меня устроит и С/C++, и Free Pascal, и Perl. Обработка файлов нужна под Линакс (ext3) Пожалуйста, помогите! P.S. В форуме C/C++ спрашивал - пока никто не ответил |
Сообщ.
#2
,
|
|
|
если включить
#define _LARGEFILE64_SOURCE 1 то loff_t должен стать 64 битным (т.е. long long), это даст возможность делать lseek64 за пределы 2G, это все справедливо для block devices, на простых файлах не пробовал. Но это легко проверить до написания прог, надо глянуть драйверы ext3, и проверить размерность loff_t в реализации seek. |
Сообщ.
#3
,
|
|
|
Цитата 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 так не может! ... или может? |
Сообщ.
#4
,
|
|
|
лехко.
#!/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. |
Сообщ.
#5
,
|
|
|
Цитата 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? Покажи работающий перловый код. И еще...Может чего в в ядре добавили за это время? У тебя ядро то по-новее будет. |
Сообщ.
#6
,
|
|
|
Цитата 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 этот код не обработает... Я позволю себе коментарии расставить! <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 ??? |
Сообщ.
#7
,
|
|
|
опс.
23 мега. а с перепою показалось гиг ) |
Сообщ.
#8
,
|
|
|
про проверки ипроч ...
задача тривиальная и разовая. писалось все на коленке с жесточайшего похмелья за пять мин. и сразу забылось ) а про 30 гиг - интересно. правда никогда такой задачи не было. 4 гига было. найду сырц - скину. |
Сообщ.
#9
,
|
|
|
Цитата lamo, 21.06.02, 13:43:25 про проверки ипроч ... задача тривиальная и разовая. писалось все на коленке с жесточайшего похмелья за пять мин. и сразу забылось ) а про 30 гиг - интересно. правда никогда такой задачи не было. 4 гига было. найду сырц - скину. Я не говорю что проверки - нечто экзотическое. Эт-так, просто на файлах в 30G это спасает от дополнительной головной боли в тяжкие времена похмелья. ;D ;D ;D А вот если сырец найдешь - будет очень даже замечательно. Проблему-то я решил, но на Ц++. А вот если бы Перл'овкой все сделать ... Уважаю я Перл, а так досадно даже как-то ;D ;D ;D |