in reply to Perl Hashes in C?

BrianP,

Maybe this helps?

use strict; use warnings; # my $file = '249465.pprgb-srgb.absv.4000.cs.jpg'; # Original + File downloaded my $file = '249465.pprgb-srgb.absv.4000.cs.jpg2'; # New File + multiple copies my $compraw = -s $file; my $pixels = int ( $compraw / 6 ); my @UINT48; $UINT48[$pixels] = ''; ## Allocate size of array ( faster ) open ( my $in, "<", "./$file") or die "$!\n"; if ( 1 ) { my $loc = -1; my $size = sysread( $in, my $buffer, $compraw ); # No bu +ffering if ( $size ne $compraw ) { die "Disk error: $!\n" } while( $buffer ) { $UINT48[$loc++] = substr( $buffer, 0, 6, '' ); } } close $in; ## $buffer is gone! ## @UINT48 is populated with 6 byte RG +B strings my $uint48 = scalar @UINT48; print "\nImage has $uint48 pixels\n"; ## How to get the values back! my ( $R,$G,$B ) = unpack( "SSS", $UINT48[0] ); print "\t$R,$G,$B\n"; ( $R,$G,$B ) = unpack( "SSS", $UINT48[$pixels] ); print "\t$R,$G,$B\n"; __END__ > time pyrperl uniqcolors.plx Image has 41473711 pixels 17994,17993,256 55551,57599,4096 real 0m13.745s user 0m12.905s sys 0m0.840s >
For you earlier question about reading from disk, Linux reads/writes in 4096 byte blocks. So I multiply the pagesize * 6 (since 4096 is not exactly divisible by 6). Use you system page size and multiply by a factor of 6 ( 6,12,...).

If you want '$buffer' around after the populate cycle, just remove the "if ( 1 ){ }" or define '$buffer' before the loop,

Regards...Ed

"Well done is better than well said." - Benjamin Franklin