AI-MXNet

 view release on metacpan or  search on metacpan

lib/AI/MXNet/RecordIO.pm  view on Meta::CPAN

=head2 pack

    pack a string into MXImageRecord

    Parameters
    ----------
    $header : AI::MXNet::IRHeader or ArrayRef suitable for AI::MXNet::IRHeader->new(@{ ArrayRef })
        header of the image record.
        $header->label can be a number or an array ref.
    s : str
        string to pack
=cut

method pack(AI::MXNet::IRHeader|ArrayRef $header, Str $s)
{
    $header = AI::MXNet::IRHeader->new(@$header) unless blessed $header;
    if(not ref $header->label)
    {
        $header->flag(0);
    }
    else
    {
        my $label = AI::MXNet::NDArray->array($header->label, dtype=>'float32')->aspdl;
        $header->label(0);
        $header->flag($label->nelem);
        my $buf = ${$label->get_dataref};
        $s = "$buf$s";
    }
    $s = pack('IfQQ', @{ $header }) . $s;
    return $s;
}

package AI::MXNet::IndexedRecordIO;
use Mouse;
use AI::MXNet::Base;
extends 'AI::MXNet::RecordIO';

=head1 NAME

    AI::MXNet::IndexedRecordIO - Read/write RecordIO format data supporting random access.
=cut

=head2 new

    Parameters
    ----------
    idx_path : str
        Path to index file
    uri : str
        Path to record file. Only support file types that are seekable.
    flag : str
        'w' for write or 'r' for read
=cut

has 'idx_path'  => (is => 'ro', isa => 'Str', required => 1);
has [qw/idx
    keys fidx/] => (is => 'rw', init_arg => undef);

method open()
{
    $self->SUPER::open();
    $self->idx({});
    $self->keys([]);
    open(my $f, $self->flag eq 'r' ? '<' : '>', $self->idx_path);
    $self->fidx($f);
    if(not $self->writable)
    {
        while(<$f>)
        {
            chomp;
            my ($key, $val) = split(/\t/);
            push @{ $self->keys }, $key;
            $self->idx->{$key} = $val;
        }
    }
}

method close()
{
    return if not $self->is_open;
    $self->SUPER::close();
    $self->fidx(undef);
}

=head2 seek

    Query current read head position.
=cut

method seek(Int $idx)
{
    assert(not $self->writable);
    my $pos = $self->idx->{$idx};
    check_call(AI::MXNetCAPI::RecordIOReaderSeek($self->handle, $pos));
}

=head2 tell

    Query current write head position.
=cut

method tell()
{
    assert($self->writable);
    return scalar(check_call(AI::MXNetCAPI::RecordIOWriterTell($self->handle)));
}

=head2 read_idx

    Read record with the index.

    Parameters:
    -----------
    $idx
=cut

method read_idx(Int $idx)
{
    $self->seek($idx);
    return $self->read();
}

=head2 write_idx

    Write record with index.

    Parameters:
    -----------
    Int $idx
    Str $buf
=cut

method write_idx(Int $idx, Str $buf)
{
    my $pos = $self->tell();
    $self->write($buf);
    my $f = $self->fidx;
    print $f "$idx\t$pos\n";
    $self->idx->{$idx} = $pos;
    push @{ $self->keys }, $idx;
}



( run in 1.645 second using v1.01-cache-2.11-cpan-437f7b0c052 )