[Moscow.pm] аналоги File::Magic

Ruslan Zakirov ruslan.zakirov на gmail.com
Ср Дек 23 14:16:57 PST 2009


2009/12/23 Alexey Kolpakov <kolpak на stack.net>:
> Понял, спасибо!
>
> Кто из них быстрее?

perl contrib/bench-mime-detect.pl /Users/ruz/f1.avi
module: SVK::MimeDetect::FileMMagic	type: application/octet-stream
module: SVK::MimeDetect::FileType	type: video/x-msvideo
module: SVK::MimeDetect::Internal	type: application/octet-stream
                Rate File::MMagic   File::Type     Internal
File::MMagic   234/s           --         -97%         -99%
File::Type    7965/s        3308%           --         -65%
Internal     22500/s        9527%         182%           --

Как видите есть разница в определении. Наверное LibMagic будет
поинтереснее, так как она на сигнатурах работает. У меня просто не
стоит в системе либа.

module: SVK::MimeDetect::FileMMagic	type: application/x-gzip
module: SVK::MimeDetect::FileType	type: application/x-gzip
module: SVK::MimeDetect::Internal	type: application/octet-stream
                Rate File::MMagic   File::Type     Internal
File::MMagic  1167/s           --         -81%         -95%
File::Type    6164/s         428%           --         -72%
Internal     21951/s        1780%         256%           --


Поставил либу libmagic, которая из дистра file. Вот такие результаты:

module: SVK::MimeDetect::FileLibMagic	type: application/x-gzip
module: SVK::MimeDetect::FileMMagic	type: application/x-gzip
module: SVK::MimeDetect::FileType	type: application/x-gzip
module: SVK::MimeDetect::Internal	type: application/octet-stream
                  Rate  File::MMagic File::LibMagic    File::Type       Internal
File::MMagic    1184/s            --           -46%          -81%           -95%
File::LibMagic  2211/s           87%             --          -65%           -90%
File::Type      6250/s          428%           183%            --           -72%
Internal       21951/s         1754%           893%          251%             --

module: SVK::MimeDetect::FileLibMagic	type: video/x-msvideo
module: SVK::MimeDetect::FileMMagic	type: application/octet-stream
module: SVK::MimeDetect::FileType	type: video/x-msvideo
module: SVK::MimeDetect::Internal	type: application/octet-stream
                  Rate  File::MMagic File::LibMagic    File::Type       Internal
File::MMagic     235/s            --           -52%          -97%           -99%
File::LibMagic   492/s          109%             --          -94%           -98%
File::Type      7895/s         3261%          1506%            --           -65%
Internal       22500/s         9480%          4477%          185%             --

module: SVK::MimeDetect::FileLibMagic	type: image/jpeg
module: SVK::MimeDetect::FileMMagic	type: image/jpeg
module: SVK::MimeDetect::FileType	type: image/jpeg
module: SVK::MimeDetect::Internal	type: application/octet-stream
                  Rate  File::MMagic File::LibMagic    File::Type       Internal
File::MMagic     536/s            --           -56%          -89%           -98%
File::LibMagic  1210/s          126%             --          -74%           -94%
File::Type      4712/s          779%           290%            --           -79%
Internal       21951/s         3993%          1715%          366%             --

В общем как-то так. Я бы остановился на LibMagic или File::Type

Обязательно нужно сравнить на файлах без расширений. Хотя зависит от задачи.

> Internal чем отличается от остальных?

Там простая проверка, нужно просто знать бинарный или текстовой файл.
Возможно используется что-то из либ subversion'а.


> Ruslan Zakirov пишет:
>>
>> Привет, Алексей.
>>
>> Есть у нас в SVK вот такой вот скрипт для бенчмарка четырех вариантов:
>>
>> use strict;
>> use warnings;
>>
>> use Benchmark qw( cmpthese );
>>
>> my %modules = map {
>>    eval "require $_" if $_ ne 'Internal';
>>    $@ ? () : ( $_ => make_sub($_) )
>> } qw( File::LibMagic File::MMagic File::Type Internal );
>>
>> my $filename = 'data.sample';
>> open my $fh, '>', $filename;
>> print $fh 'Some sample ASCII data for mime detecting';
>> close $fh;
>>
>> cmpthese( 9_000, \%modules );
>>
>> sub make_sub {
>>    ( my $module = shift ) =~ s/:://g;
>>    $module = "SVK::MimeDetect::$module";
>>    eval "require $module";
>>    die "Couldn't load $module\n" if $@;
>>    my $object = $module->new();
>>    return sub { $object->checktype_filename($filename) };
>> }
>>
>>
>> 2009/12/23 Alexey Kolpakov <kolpak на stack.net>:
>>>
>>> Привет!
>>> Какие модули посоветуете использовать для определения типа файла
>>> (расположенного на локальном диске)?
>>>
>>> Спасибо.
>>> --
>>> Moscow.pm mailing list
>>> moscow-pm на pm.org | http://moscow.pm.org
>>>
>>
>>
>>
> --
> Moscow.pm mailing list
> moscow-pm на pm.org | http://moscow.pm.org
>



-- 
Best regards, Ruslan.


Подробная информация о списке рассылки Moscow-pm