ReadStreamStat ToBinaryForThread(io::ReadStream<Read>& stream, size_t buf_size, size_t thread_num, LibraryOrientation orientation) { ReadBinaryWriter<Read> read_writer(orientation); size_t buffer_reads = buf_size / (sizeof (Read) * 4); std::vector<Read> buf(buffer_reads); ReadStreamStat stat; file_ds_[thread_num]->seekp(0); stat.write(*file_ds_[thread_num]); size_t current = 0; while (!stream.eof()) { Read& r = buf[current]; stream >> r; stat.increase(r); ++current; if (stat.read_count_ % buffer_reads == 0) { FlushBuffer(buf, read_writer, *file_ds_[thread_num]); current = 0; } } buf.resize(current); FlushBuffer(buf, read_writer, *file_ds_[thread_num]); file_ds_[thread_num]->seekp(0); stat.write(*file_ds_[thread_num]); return stat; }
ReadStreamStat get_stat() const { ReadStreamStat stat; for (size_t i = 0; i < readers_.size(); ++i) { stat.merge(readers_[i]->get_stat()); } return stat; }
ReadStreamStat ToBinary(io::ReadStream<Read>& stream, size_t buf_size, LibraryOrientation orientation) { ReadBinaryWriter<Read> read_writer(orientation); size_t buffer_reads = buf_size / (sizeof (Read) * 4); size_t reads_to_flush = buffer_reads * file_num_; std::vector< std::vector<Read> > buf(file_num_, std::vector<Read>(buffer_reads) ); std::vector< ReadStreamStat > read_stats(file_num_); std::vector< size_t > current_buf_sizes(file_num_, 0); size_t read_count = 0; for (size_t i = 0; i < file_num_; ++i) { file_ds_[i]->seekp(0); read_stats[i].write(*file_ds_[i]); } size_t buf_index; while (!stream.eof()) { buf_index = read_count % file_num_; Read& r = buf[buf_index][current_buf_sizes[buf_index]]; stream >> r; read_stats[buf_index].increase(r); ++current_buf_sizes[buf_index]; VERBOSE_POWER(++read_count, " reads processed"); if (read_count % reads_to_flush == 0) { for (size_t i = 0; i < file_num_; ++i) { FlushBuffer(buf[i], read_writer, *file_ds_[i]); current_buf_sizes[i] = 0; } } } ReadStreamStat result; for (size_t i = 0; i < file_num_; ++i) { buf[i].resize(current_buf_sizes[i]); FlushBuffer(buf[i], read_writer, *file_ds_[i]); file_ds_[i]->seekp(0); read_stats[i].write(*file_ds_[i]); result.merge(read_stats[i]); } INFO(read_count << " reads written"); return result; }