<?xml version="1.0" encoding="windows-1252"?>
<node id="732843" title="Compact and sparse bit vector" created="2008-12-27 16:37:03" updated="2008-12-27 16:37:03">
<type id="1042">
CUFP</type>
<author id="194920">
diotalevi</author>
<data>
<field name="doctext">
&lt;p&gt;In a reply to [id://732407], I suggested that [mod://Judy::1]/[http://judy.sourceforge.net/doc/Judy1_3x.htm|Judy1(3)] was a sparse bit vector which might be interesting as a replacement for vec(). Perl's built-in vec can also be used as a bit vector but it's not sparse - all bits between the zeroth to the highest ever set are instantiated inside a perl string. This is only convenient if your bit vector isn't too big in ram.&lt;/p&gt;

&lt;h2&gt;Example code&lt;/h2&gt;

&lt;p&gt;A simple perl bit vector&lt;/p&gt;&lt;c&gt;use constant MEGABYTE =&gt; 2 ** 20;
my $vector = '';
# 5,000 bits. Set every 100th bit between 15 million and 20 million. 
for ( 15_000_000 .. 20_000_000 ) {
    if ( ! ( $_ % 100 ) ) {
        vec( $vector, $_, 1 ) = 1;
    }
}
printf "%0.1fM\n", length( $vector ) / MEGABYTE;&lt;/c&gt;

&lt;p&gt;A simple Judy::1 bit vector&lt;/p&gt;&lt;c&gt;use constant KILOBYTE =&gt; 2 ** 10;
use Judy::1 qw( Set MemUsed );
my $vec;
# 5,000 bits. Set every 100th bit between 15 million and 20 million.
for ( 15_000_000 .. 20_000_000 ) {
    if ( ! ( $_ % 100 ) ) {
        Set( $judy, $_ );
    }
}
printf "%0.1fK\n", MemUsed( $judy ) / KILOBYTE;&lt;/c&gt;

&lt;h2&gt;Memory "benchmarks"&lt;/h2&gt;

&lt;table&gt;
&lt;tr&gt;&lt;th&gt;Density&lt;/th&gt;&lt;th&gt;vec()&lt;/th&gt;&lt;th&gt;Judy::1&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan="3"&gt;Tests using the entire range 0..20,000,000&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Every bit&lt;/td&gt;&lt;td&gt;2.3M&lt;/td&gt;&lt;td&gt;618K&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;table&gt;
&lt;tr&gt;&lt;th&gt;Density&lt;/th&gt;&lt;th&gt;vec()&lt;/th&gt;&lt;th&gt;Judy::1&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan="3"&gt;Tests using range 15,000,000..20,000,000&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Every bit&lt;/td&gt;&lt;td&gt;2.3M&lt;/td&gt;&lt;td&gt;162K&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Every 10th bit&lt;/td&gt;&lt;td&gt;2.3M&lt;/td&gt;&lt;td&gt;772K&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Every 100th bit&lt;/td&gt;&lt;td&gt;2.3M&lt;/td&gt;&lt;td&gt;158K&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Every 1000th bit&lt;/td&gt;&lt;td&gt;2.3M&lt;/td&gt;&lt;td&gt;65K&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;div class="pmsig"&gt;&lt;div class="pmsig-194920"&gt;
&lt;p&gt;&amp;#x2824;&amp;#x2824; &amp;#x2819;&amp;#x280a;&amp;#x2815;&amp;#x281e;&amp;#x2801;&amp;#x2807;&amp;#x2811;&amp;#x2827;&amp;#x280a;&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;</field>
</data>
</node>
