From 573d837609b665d4e4021c1a682c3c675be772b7 Mon Sep 17 00:00:00 2001 From: Andrej Babic Date: Fri, 19 Jan 2018 16:15:15 +0100 Subject: [PATCH] Replace rapidjson with boost ptree --- conda-recipe/meta.yaml | 2 -- src/config.cpp | 2 ++ src/config.hpp | 2 ++ src/h5_zmq_writer.cpp | 42 ++++++++++++++++++++++++------------------ 4 files changed, 28 insertions(+), 20 deletions(-) diff --git a/conda-recipe/meta.yaml b/conda-recipe/meta.yaml index 756953c..0b24091 100644 --- a/conda-recipe/meta.yaml +++ b/conda-recipe/meta.yaml @@ -14,13 +14,11 @@ requirements: - gcc - cppzmq - hdf5 - - rapidjson - boost run: - cppzmq - hdf5 - - rapidjson - boost diff --git a/src/config.cpp b/src/config.cpp index 8c40719..57ac5e6 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -4,6 +4,8 @@ namespace config { // Receiver config. int zmq_n_io_threads = 1; int zmq_receive_timeout = 100; + int zmq_buffer_size_header = 1024 * 1024 * 0.2; + int zmq_buffer_size_data = 1024 * 1024 * 10; // Ring buffer config. size_t ring_buffer_n_slots = 100; diff --git a/src/config.hpp b/src/config.hpp index c4ca7d0..856dd45 100644 --- a/src/config.hpp +++ b/src/config.hpp @@ -8,6 +8,8 @@ namespace config { extern int zmq_n_io_threads; extern int zmq_receive_timeout; + extern int zmq_buffer_size_header; + extern int zmq_buffer_size_data; extern size_t ring_buffer_n_slots; extern uint32_t ring_buffer_read_retry_interval; diff --git a/src/h5_zmq_writer.cpp b/src/h5_zmq_writer.cpp index 8dd5e22..7045ebb 100644 --- a/src/h5_zmq_writer.cpp +++ b/src/h5_zmq_writer.cpp @@ -1,11 +1,11 @@ #include +#include #include #include #include #include -#include -#include "rapidjson/document.h" -#include +#include + #include "config.hpp" #include "WriterManager.hpp" @@ -14,7 +14,10 @@ #include "rest_interface.hpp" #include "h5_utils.hpp" + + using namespace std; +namespace pt = boost::property_tree; void write_h5(WriterManager *manager, RingBuffer *ring_buffer, string output_file) { @@ -60,35 +63,38 @@ void receive_zmq(WriterManager *manager, RingBuffer *ring_buffer, string connect receiver.setsockopt(ZMQ_RCVTIMEO, receive_timeout); receiver.connect(connect_address); - zmq::message_t message_data; + zmq::message_t message_header(config::zmq_buffer_size_header); + zmq::message_t message_data(config::zmq_buffer_size_data); + FrameMetadata frame_metadata; - rapidjson::Document header_parser; + pt::ptree json_header; while (manager->is_running()) { // Get the message header. - if (!receiver.recv(&message_data)){ + if (!receiver.recv(&message_header)){ continue; } // Parse JSON header. - char* header = static_cast(message_data.data()); - header_parser.Parse(header); + string header_string(static_cast(message_header.data()), message_header.size()); + stringstream header_stream; + header_stream << header_string << endl; + pt::read_json(header_stream, json_header); // Extract data from message header. - frame_metadata.frame_index = header_parser["frame"].GetUint64(); + frame_metadata.frame_index = json_header.get("frame"); - auto header_shape = header_parser["shape"].GetArray(); - frame_metadata.frame_shape[0] = header_shape[0].GetUint64(); - frame_metadata.frame_shape[1] = header_shape[1].GetUint64(); - - if (header_parser.HasMember("endianness")) { - if (string("big") == header_parser["endianness"].GetString()) { - frame_metadata.endianness = "big"; - } + uint8_t index = 0; + for (auto item : json_header.get_child("shape")) { + frame_metadata.frame_shape[index] = item.second.get_value(); + index++; } + + // Array 1.0 specified little endian as the default encoding. + frame_metadata.endianness = json_header.get("endianness", "little"); - frame_metadata.type = header_parser["type"].GetString(); + frame_metadata.type = json_header.get("type"); // Get the message data. receiver.recv(&message_data);