On Sat, May 20, 2000 at 08:01:36PM +0100, Malcolm Beattie wrote:
> Matt Sergeant writes:
> > On Fri, 19 May 2000, David Larkin wrote:
> >
> > > I require a large array of ints in a real application, just stripped
> > > problem down to bear bones for demo.
> >
> > Is your array sparse by any chance? If not your modperl daemon is going to
> > get _much_ larger after you populate that array. If it's sparse, consider
> > using a hash - that will give you a slight speed penalty at the benefit of
> > not consuming quite so much ram. Other things to consider:
> >
> > Re-write this critical bit of code in XS (not as hard as it sounds).
> > Use a database.
> > Use the filesystem.
>
> Simply store them in native form in a big long string, just like C
> would do. Pre-extend the string first, if you know how big you want it:
> $intsize = 4; # alter if sizeof(int) != 4
> $intarray = "\0" x (30000 * $intsize);
> Update index $i with
> substr($intarray, $i * $intsize, $intsize) = pack("I", $newval);
> which assumes an unsigned int, or use "i" for signed.
> To retrieve index $i use
> $val = unpack("I", substr($intarray, $i * $intsize, $intsize));
> You can even retrive a bunch of them faster with
> @ten_to_thirty = unpack("I20", substr(...));
> or set a bunch with
> substr(..., $intsize * 10) = pack("I20", @ten_to_thirty);
Er, wouldn't using vec() be simpler and faster?
Tim.