 
     typedef PackedStream<word_type*,uint8,SYMBOL_SIZE,true,uint64>  packed_stream_type;
 
-    Reads() : n_reads(0), n_symbols(0), min_len(uint32(-1)), max_len(0) {}
+    Reads() : n_reads(0), n_symbols(0), min_len(uint32(-1)), max_len(0), reserved_words(0u), h_read_storage( NULL ) {}
+    ~Reads() { free( h_read_storage ); }
 
     uint32                      n_reads;            // number of reads
     uint64                      n_symbols;          // number of symbols
     uint32                      min_len;            // minimum read length
     uint32                      max_len;            // maximum read length
-    thrust::host_vector<uint32> h_read_storage;     // read storage
+    uint64                      reserved_words;     // allocated words
+    word_type*                  h_read_storage;     // read storage
     thrust::host_vector<uint64> h_read_index;       // read index
 };
 


        const uint64 required_words = util::divide_ri( reads->n_symbols + h_read_data.bps(), SYMBOLS_PER_WORD );

        reads->h_read_storage.resize( required_words );

        // pack the first few symbols to fill the last word
        const uint32 word_offset = reads->n_symbols & (SYMBOLS_PER_WORD-1);

        {
            log_verbose(stderr, "  using fast path\n");

            thrust::device_vector<word_type> d_read_storage( input_words );
            thrust::device_vector<uint64>    d_read_index( reads.h_read_index );

            thrust::copy( reads.h_read_storage, reads.h_read_storage + input_words, d_read_storage.begin() );

            const packed_stream_type d_packed_string( (word_type*)nvbio::plain_view( d_read_storage ) );

