From 59a5edd9eb78a93faa6505984260de4fa11c1147 Mon Sep 17 00:00:00 2001 From: Andrej Babic Date: Mon, 27 Apr 2020 16:05:21 +0200 Subject: [PATCH] Add naive buffer implementation --- core-buffer/include/SFWriter.hpp | 3 ++ core-buffer/include/buffer_config.hpp | 3 ++ core-buffer/src/SFWriter.cpp | 53 ++++++++++++++++++--------- 3 files changed, 41 insertions(+), 18 deletions(-) diff --git a/core-buffer/include/SFWriter.hpp b/core-buffer/include/SFWriter.hpp index b8fd593..5ea6900 100644 --- a/core-buffer/include/SFWriter.hpp +++ b/core-buffer/include/SFWriter.hpp @@ -20,6 +20,9 @@ class SFWriter { H5::DataSet daq_rec_dataset_; H5::DataSet n_received_packets_dataset_; + std::unique_ptr image_buffer_; + size_t image_buffer_count_; + public: SFWriter( const std::string& output_file, diff --git a/core-buffer/include/buffer_config.hpp b/core-buffer/include/buffer_config.hpp index f5bec4a..c43e1e5 100644 --- a/core-buffer/include/buffer_config.hpp +++ b/core-buffer/include/buffer_config.hpp @@ -29,6 +29,9 @@ namespace core_buffer { const size_t BUFFER_RB_SIZE = 1000; const int WRITER_ZMQ_IO_THREADS = 16; + + // How many frames to buffer before flushing to file. + const size_t WRITER_BUFFER_SIZE = 100; } #endif //BUFFERCONFIG_HPP diff --git a/core-buffer/src/SFWriter.cpp b/core-buffer/src/SFWriter.cpp index 2ab8328..1f9f12c 100644 --- a/core-buffer/src/SFWriter.cpp +++ b/core-buffer/src/SFWriter.cpp @@ -15,7 +15,8 @@ SFWriter::SFWriter( const size_t n_modules) : n_frames_(n_frames), n_modules_(n_modules), - current_write_index_(0) + current_write_index_(0), + image_buffer_count_(0) { file_ = H5::H5File(output_file, H5F_ACC_TRUNC); @@ -57,6 +58,10 @@ SFWriter::SFWriter( "n_received_packets", H5::PredType::NATIVE_UINT16, metadata_dataspace); + + image_buffer_ = make_unique( + n_modules_ * MODULE_N_BYTES * WRITER_BUFFER_SIZE); + image_buffer_count_ = 0; } SFWriter::~SFWriter() @@ -95,24 +100,36 @@ void SFWriter::write(shared_ptr metadata, char* data) { // buffer_space, // disk_space); - hsize_t offset[] = {current_write_index_, 0, 0}; + if (image_buffer_count_ < WRITER_BUFFER_SIZE) { + char* buffer = image_buffer_.get(); - if( H5DOwrite_chunk( - image_dataset_.getId(), - H5P_DEFAULT, - 0, - offset, - MODULE_N_BYTES * n_modules_, - data)) - { - stringstream error_message; - using namespace date; - error_message << "[" << std::chrono::system_clock::now() << "]"; - error_message << "Error while writing data to file at offset "; - error_message << current_write_index_ << "." << endl; + memcpy( + (buffer + image_buffer_count_), + data, + MODULE_N_BYTES * n_modules_); - throw runtime_error(error_message.str()); + image_buffer_count_++; + } else { + hsize_t offset[] = {current_write_index_, 0, 0}; + + if( H5DOwrite_chunk( + image_dataset_.getId(), + H5P_DEFAULT, + 0, + offset, + MODULE_N_BYTES * n_modules_ * WRITER_BUFFER_SIZE, + image_buffer_.get())) + { + stringstream error_message; + using namespace date; + error_message << "[" << std::chrono::system_clock::now() << "]"; + error_message << "Error while writing data to file at offset "; + error_message << current_write_index_ << "." << endl; + + throw runtime_error(error_message.str()); + } + + current_write_index_ += WRITER_BUFFER_SIZE; + image_buffer_count_ = 0; } - - current_write_index_++; }