Exemple #1
0
void 
write(const char* c_filename,const ParticlesData& particles,const bool forceCompressed)
{
    std::string filename(c_filename);
    std::string extension;
    bool endsWithGz;
    if(!extensionIgnoringGz(filename,extension,endsWithGz)) return;
    std::map<std::string,WRITER_FUNCTION>::iterator i=writers().find(extension);
    if(i==writers().end()){
        std::cerr<<"Partio: No writer defined for extension "<<extension<<std::endl;
        return;
    }
    (*i->second)(c_filename,particles,forceCompressed || endsWithGz);
}
Exemple #2
0
int main(int argc, char *argv[]) {
  (void)argc;
  (void)argv;
  std::cout << "Performance benchmark" << std::endl;
  const std::string storage_path = "testStorage";
  
  {
    std::cout << "write..." << std::endl;

    const size_t chunk_per_storage = 1024 * 10;
    const size_t chunk_size = 1024;
    const size_t cap_B = 5;
    const size_t max_mem_chunks = 100;

    if (dariadb::utils::fs::path_exists(storage_path)) {
      dariadb::utils::fs::rm(storage_path);
    }

    dariadb::Time start_time = dariadb::timeutil::current_time();
    dariadb::storage::Capacitor::Params cap_param(cap_B, storage_path);
    cap_param.max_levels = 11;
    auto raw_ptr = new dariadb::storage::Engine(
        dariadb::storage::PageManager::Params(storage_path, chunk_per_storage,
                                              chunk_size),
        cap_param, dariadb::storage::Engine::Limits(max_mem_chunks));

    dariadb::storage::MeasStorage_ptr ms{raw_ptr};

    dariadb::IdSet all_id_set;
    append_count = 0;
    stop_info = false;

    std::thread info_thread(show_info, raw_ptr);

    std::vector<std::thread> writers(dariadb_bench::total_threads_count);

    size_t pos = 0;
    for (size_t i = 1; i < dariadb_bench::total_threads_count + 1; i++) {
      all_id_set.insert(pos);
      std::thread t{dariadb_bench::thread_writer_rnd_stor, dariadb::Id(pos),
                    dariadb::Time(i), &append_count, raw_ptr};
      writers[pos++] = std::move(t);
    }

    pos = 0;
    for (size_t i = 1; i < dariadb_bench::total_threads_count + 1; i++) {
      std::thread t = std::move(writers[pos++]);
      t.join();
    }

    stop_info = true;
    info_thread.join();

    {
      std::cout << "full flush..." << std::endl;
      auto start = clock();
      raw_ptr->flush();
      auto elapsed = (((float)clock() - start) / CLOCKS_PER_SEC);
      std::cout << "flush time: " << elapsed << std::endl;
    }

    auto queue_sizes = raw_ptr->queue_size();
    std::cout << "\r"
              << " in queue: (p:" << queue_sizes.pages_count << " cap:" << queue_sizes.cola_count << ")"
              << std::endl;

    dariadb_bench::readBenchark(all_id_set, ms, 10,start_time, dariadb::timeutil::current_time());

    {
      std::cout << "read all..." << std::endl;
      std::shared_ptr<BenchCallback> clbk{new BenchCallback()};
      auto start = clock();
      dariadb::storage::QueryInterval qi{
          dariadb::IdArray(all_id_set.begin(), all_id_set.end()), 0, start_time,
         ms->maxTime() };
      ms->readInterval(qi)->readAll(clbk.get());

      auto elapsed = (((float)clock() - start) / CLOCKS_PER_SEC);
      std::cout << "readed: " << clbk->count << std::endl;
      std::cout << "time: " << elapsed << std::endl;
      auto expected =
          (dariadb_bench::iteration_count * dariadb_bench::total_threads_count);
      if (clbk->count != expected) {
        std::cout << "expected: " << expected << " get:" << clbk->count << std::endl;
        throw MAKE_EXCEPTION("(clbk->count!=(iteration_count*total_threads_count))");
      }
    }
    std::cout << "stoping storage...\n";
    ms = nullptr;
  }
  std::cout << "cleaning...\n";
  if (dariadb::utils::fs::path_exists(storage_path)) {
    dariadb::utils::fs::rm(storage_path);
  }
}
int main(int argc, char *argv[]) {
    po::options_description desc("Multithread IO benchmark.\n Allowed options");
	desc.add_options()("help", "produce help message")
		("mc", po::value<size_t>(&meas2write)->default_value(meas2write), "measurment count")
		("ic", po::value<size_t>(&iteration_count)->default_value(iteration_count), "iteration count")
		("dyncache", po::value<bool>(&enable_dyn_cache)->default_value(enable_dyn_cache), "enable dynamic cache")
		("cache-size", po::value<size_t>(&cache_size)->default_value(cache_size), "cache size")
		("cache-pool-size", po::value<size_t>(&cache_pool_size)->default_value(cache_pool_size), "cache pool size")
        ("thread-count", po::value<size_t>(&thread_count)->default_value(thread_count), "write thread count")
        ("page-size", po::value<size_t>(&pagesize)->default_value(pagesize), "page size")
		("verbose", "verbose ouput")
		("dont-remove", "dont remove created storage");

	po::variables_map vm;
	try {
		po::store(po::parse_command_line(argc, argv, desc), vm);
	} catch (std::exception &ex) {
		logger("Error: " << ex.what());
		exit(1);
	}
	po::notify(vm);

	if (vm.count("help")) {
		std::cout << desc << std::endl;
		return 1;
	}

	if (vm.count("verbose")) {
		verbose = true;
	}

	if (vm.count("dont-remove")) {
		dont_remove = true;
	}

	makeStorage();
	std::thread info_thread(show_info);

    logger("threads count: "<<thread_count);
	/// writers
	std::vector<std::thread> writers(thread_count);
	size_t pos = 0;
    for (size_t i = 0; i < thread_count; i++) {
		std::thread t{ writer, iteration_count };
		writers[pos++] = std::move(t);
	}

	pos = 0;
    for (size_t i = 0; i < thread_count; i++) {
		std::thread t = std::move(writers[pos++]);
		t.join();
	}

	stop_info = true;
	info_thread.join();

	/// readers
	stop_info = false;
	std::thread read_info_thread(show_reads_info);
	std::vector<std::thread> readers(thread_count);
	pos = 0;
	auto reads_per_thread = (iteration_count / ((float)thread_count));
    for (size_t i = 0; i < thread_count; i++) {
		std::thread t{ reader,i, reads_per_thread*i, reads_per_thread*(i+1) };
		readers[pos++] = std::move(t);
	}

	pos = 0;
    for (size_t i = 0; i < thread_count; i++) {
		std::thread t = std::move(readers[pos++]);
		t.join();
	}
	stop_info = true;
	read_info_thread.join();

    ds=nullptr;
	if (!dont_remove) {
        nkvdb::utils::rm(storage_path);
	}
}
Exemple #4
0
int bamsplitmod(libmaus::util::ArgInfo const & arginfo)
{
    if ( isatty(STDIN_FILENO) )
    {
        ::libmaus::exception::LibMausException se;
        se.getStream() << "Refusing read binary data from terminal, please redirect standard input to pipe or file." << std::endl;
        se.finish();
        throw se;
    }

    int const level = libmaus::bambam::BamBlockWriterBaseFactory::checkCompressionLevel(arginfo.getValue<int>("level",getDefaultLevel()));
    int const verbose = arginfo.getValue<int>("verbose",getDefaultVerbose());
    uint64_t const div = arginfo.getValue<int>("div",getDefaultDiv());
    std::string const prefix = arginfo.getUnparsedValue("prefix",getDefaultFilePrefix(arginfo));

    if ( ! div )
    {
        ::libmaus::exception::LibMausException se;
        se.getStream() << "div cannot be 0." << std::endl;
        se.finish();
        throw se;
    }

    libmaus::bambam::BamDecoder bamdec(std::cin);
    libmaus::bambam::BamAlignment const & algn = bamdec.getAlignment();
    libmaus::bambam::BamHeader const & header = bamdec.getHeader();
    ::libmaus::bambam::BamHeader::unique_ptr_type uphead(updateHeader(arginfo,header));

    libmaus::autoarray::AutoArray<libmaus::aio::CheckedOutputStream::unique_ptr_type> COS(div);
    libmaus::autoarray::AutoArray<libmaus::bambam::BamWriter::unique_ptr_type> writers(div);
    std::vector < std::string > filenames;
    for ( uint64_t i = 0; i < div; ++i )
    {
        std::ostringstream ostr;
        ostr << prefix << "_" << std::setw(6) << std::setfill('0') << i << std::setw(0) << ".bam";

        libmaus::aio::CheckedOutputStream::unique_ptr_type tCOS(new libmaus::aio::CheckedOutputStream(ostr.str()));
        COS[i] = UNIQUE_PTR_MOVE(tCOS);
        libmaus::bambam::BamWriter::unique_ptr_type twriter(new libmaus::bambam::BamWriter(*COS[i],*uphead,level));
        writers[i] = UNIQUE_PTR_MOVE(twriter);
    }

    uint64_t c = 0;
    if ( verbose )
    {
        while ( bamdec.readAlignment() )
        {
            algn.serialise ( writers [ (c++) % div ] -> getStream() );

            if ( ((c) & ((1ull<<20)-1)) == 0 )
                std::cerr << "[V] " << c << std::endl;
        }
        std::cerr << "[V] " << c << std::endl;
    }
    else
    {
        while ( bamdec.readAlignment() )
            algn.serialise ( writers [ (c++) % div ] -> getStream() );
    }

    for ( uint64_t i = 0; i < div; ++i )
    {
        writers[i].reset();
        COS[i]->flush();
        COS[i].reset();
    }

    return EXIT_SUCCESS;
}
Exemple #5
0
int main( int, char** )
{
#ifdef LUNCHBOX_USE_OPENMP
    const size_t nThreads = lunchbox::OMP::getNThreads() * 3;
#else
    const size_t nThreads = 16;
#endif

    std::cout << "       read,       write,        push,      copy,     erase, "
              << " flush/ms,  rd, other #threads" << std::endl;
    _runSerialTest< std::vector< size_t >, size_t >();
    _runSerialTest< Vector_t, size_t >();

    std::vector< Reader > readers(nThreads);
    std::vector< Writer > writers(nThreads);
    std::vector< Pusher > pushers(nThreads);

    stage_ = 1;
    size_t stage = 0;

    for( size_t l = 0; l < nThreads; ++l )
    {
        readers[l].start();
        writers[l].start();
        pushers[l].start();
    }
    lunchbox::sleep( 10 );

    for( size_t i = 1; i <= nThreads; i = i<<1 )
        for( size_t j = 1; j <= nThreads; j = j<<1 )
        {
            // concurrent read, write, push
            Vector_t vector;
            for( size_t k = 0; k < nThreads; ++k )
            {
                readers[k].vector = k < i ? &vector : 0;
                writers[k].vector = k < j ? &vector : 0;
                pushers[k].vector = k < j ? &vector : 0;
            }

            const size_t nextStage = ++stage * STAGESIZE;

            _clock.reset();
            stage_ = nextStage;
            stage_.waitEQ( nextStage + (3 * nThreads) );
            TEST( vector.size() >= LOOPSIZE );

            // multi-threaded copy
            std::vector< Copier > copiers(j);

            _clock.reset();
            for( size_t k = 0; k < j; ++k )
            {
                copiers[k].vector = &vector;
                copiers[k].start();
            }
            for( size_t k = 0; k < j; ++k )
                copiers[k].join();

            for( size_t k = 0; k < vector.size(); ++k )
                TEST( vector[k] == k || vector[k] == 0 );

            // multi-threaded erase
            std::vector< Eraser > erasers(j);

            _clock.reset();
            for( size_t k = 0; k < j; ++k )
            {
                erasers[k].vector = &vector;
                erasers[k].start();
            }
            for( size_t k = 0; k < j; ++k )
                erasers[k].join();

            for( size_t k = 0; k < vector.size(); ++k )
            {
                if( vector[k] == 0 )
                    break;
                if( k > vector.size() / 2 )
                {
                    TEST( vector[k] > vector[k-1] );
                }
                else
                {
                    TEST( vector[k] == k );
                }
            }

            // multi-threaded pop_back
            const size_t fOps = vector.size();
            std::vector< Flusher > flushers(j);
            _clock.reset();
            for( size_t k = 0; k < j; ++k )
            {
                flushers[k].vector = &vector;
                flushers[k].start();
            }
            for( size_t k = 0; k < j; ++k )
                flushers[k].join();
            const float fTime = _clock.getTimef();
            TEST( vector.empty( ));

            std::cerr << std::setw(11) << float(i*LOOPSIZE)/rTime_ << ", "
                      << std::setw(11) << float(j*LOOPSIZE)/wTime_ << ", "
                      << std::setw(11) << float(LOOPSIZE)/pTime_ << ", "
                      << std::setw(9) << float(j)/cTime_ << ", "
                      << std::setw(9) << float(j)/eTime_ << ", "
                      << std::setw(9) << float(fOps)/fTime << ", "
                      << std::setw(3) << i << ", " << std::setw(3) << j
                      << std::endl;
        }

    stage_ = std::numeric_limits< size_t >::max();
    for( size_t k = 0; k < nThreads; ++k )
    {
        readers[k].join();
        writers[k].join();
        pushers[k].join();
    }

    return EXIT_SUCCESS;
}
Exemple #6
0
int main(int argc, char *argv[]) {
  (void)argc;
  (void)argv;

  const size_t id_count = 4;
  {

    if (dariadb::utils::fs::path_exists(storagePath)) {
      dariadb::utils::fs::rm(storagePath);
    }
    std::thread info_thread(show_info);

    dariadb::storage::PageManager::start(
        dariadb::storage::PageManager::Params(storagePath, chunks_count, chunks_size));

    std::vector<std::thread> writers(dariadb_bench::total_threads_count);

    size_t pos = 0;
    for (size_t i = 1; i < dariadb_bench::total_threads_count + 1; i++) {
      std::thread t{dariadb_bench::thread_writer_rnd_stor, dariadb::Id(pos),
                    dariadb::Time(i), &append_count,
                    dariadb::storage::PageManager::instance()};
      writers[pos++] = std::move(t);
    }

    pos = 0;
    for (size_t i = 1; i < dariadb_bench::total_threads_count + 1; i++) {
      std::thread t = std::move(writers[pos++]);
      t.join();
    }

    stop_info = true;
    info_thread.join();

    std::random_device r;
    std::default_random_engine e1(r());
    std::uniform_int_distribution<dariadb::Id> uniform_dist(
        dariadb::storage::PageManager::instance()->minTime(),
        dariadb::storage::PageManager::instance()->maxTime());

    BenchCallback *clbk = new BenchCallback;
    dariadb::IdArray ids(id_count);
    for (size_t i = 0; i < id_count; ++i) {
      ids[i] = i;
    }
    const size_t runs_count = 100;
    auto start = clock();

    for (size_t i = 0; i < runs_count; i++) {
      auto time_point1 = uniform_dist(e1);
      auto time_point2 = uniform_dist(e1);
      auto from = std::min(time_point1, time_point2);
      auto to = std::max(time_point1, time_point2);
      auto link_list = dariadb::storage::PageManager::instance()->chunksByIterval(
          dariadb::storage::QueryInterval(ids, 0, from, to));
      auto cursor = dariadb::storage::PageManager::instance()->readLinks(link_list);
      cursor->readAll(clbk);
      assert(clbk->count != 0);
      clbk->count = 0;
      cursor = nullptr;
    }

    auto elapsed = ((float)clock() - start) / CLOCKS_PER_SEC;
    std::cout << "interval: " << elapsed / runs_count << std::endl;

    start = clock();

    for (size_t i = 0; i < runs_count; i++) {
      auto time_point = uniform_dist(e1);
      dariadb::storage::PageManager::instance()->valuesBeforeTimePoint(
          dariadb::storage::QueryTimePoint(ids, 0, time_point));
    }

    elapsed = ((float)clock() - start) / CLOCKS_PER_SEC;
    std::cout << "timePoint: " << elapsed / runs_count << std::endl;

    delete clbk;

    dariadb::storage::PageManager::stop();
    if (dariadb::utils::fs::path_exists(storagePath)) {
      dariadb::utils::fs::rm(storagePath);
    }
  }
}