From e21b2af2a6f44cce8946d097d62e53730a18d766 Mon Sep 17 00:00:00 2001 From: Huamonarch Date: Tue, 12 May 2026 17:19:44 +0800 Subject: [PATCH] Replace fixed 518MB array in TaskData with dynamic shared-memory vector MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit DataRecord used a fixed float[129600000] consuming 5GB disk even when collecting only a few hundred data points. Replaced with shm_vector_f that grows on demand via push_back. Removes the need for rm -rf on process exit — vector destructor frees memory back to the segment. Also drops now-unnecessary task_data_size member. --- eqpalg/algs/exp_base.cpp | 15 +++++++-------- eqpalg/algs/exp_base.h | 2 -- eqpalg/eqpalg_icei.cpp | 3 +-- shm/TaskData.h | 39 ++++++++++++++------------------------- 4 files changed, 22 insertions(+), 37 deletions(-) diff --git a/eqpalg/algs/exp_base.cpp b/eqpalg/algs/exp_base.cpp index fbe19ab..e528d97 100644 --- a/eqpalg/algs/exp_base.cpp +++ b/eqpalg/algs/exp_base.cpp @@ -149,7 +149,6 @@ AlarmInfo ExpBase::exec_mon() { } std::vector ExpBase::exec_task(mix_cc::time_range_t time_range) { - task_data_size = 0; std::vector out_alarms; /*统计类,需要单独处理数据*/ @@ -197,12 +196,12 @@ std::vector ExpBase::exec_task(mix_cc::time_range_t time_range) { this->sta_ptr_->reset_data(); /*参数重置*/ logger_->Debug() << "reset_data()------2" << endl; logger_->Debug() << "task_seq:" << task_seq << std::endl; - logger_->Debug() << "dataSize:" << task_data_size << std::endl; - for (size_t j = 0; j < task_data_size; j++) { - double dataJ = TaskShm::TaskRecordPtr.get() - -> - operator[](exp_type_ * 1000 + task_seq) - .data_record[j]; + auto &data_record = TaskShm::TaskRecordPtr.get() + -> + operator[](exp_type_ * 1000 + task_seq); + logger_->Debug() << "dataSize:" << data_record.size() << std::endl; + for (size_t j = 0; j < data_record.size(); j++) { + double dataJ = data_record[j]; this->sta_ptr_->dist_add(dataJ); } logger_->Debug() << "reset_data()------3" << endl; @@ -1364,7 +1363,7 @@ void ExpBase::task_mon_pro() { TaskShm::TaskRecordPtr.get() -> operator[](exp_type_ * 1000 + task_seq) - .data_record[task_data_size++] = res.value; + .push_back(res.value); this->sta_ptr_->running_stat_add(res.value); } } diff --git a/eqpalg/algs/exp_base.h b/eqpalg/algs/exp_base.h index 6581cab..df8e1ac 100644 --- a/eqpalg/algs/exp_base.h +++ b/eqpalg/algs/exp_base.h @@ -191,8 +191,6 @@ protected: std::unique_ptr exp_result_; - size_t task_data_size = 0; - protected: const size_t exp_type_; diff --git a/eqpalg/eqpalg_icei.cpp b/eqpalg/eqpalg_icei.cpp index e883fc0..07865ac 100644 --- a/eqpalg/eqpalg_icei.cpp +++ b/eqpalg/eqpalg_icei.cpp @@ -94,8 +94,7 @@ EqpAlgICEI::~EqpAlgICEI() { } } if (glob_process_type == ProcessType::kTask) { - string ss0 = "rm -rf /users/dsc/shm/TaskData_boost.mmap"; - system(ss0.c_str()); + // TaskData 已改用动态 vector,进程退出时自然析构,无需 rm -rf } this->logger_->Info() << "EqpAlgICEI::~EqpAlgICEI() " << "Destruct" << endl; diff --git a/shm/TaskData.h b/shm/TaskData.h index 779d260..4b03382 100644 --- a/shm/TaskData.h +++ b/shm/TaskData.h @@ -1,14 +1,13 @@ #pragma once /** * @file TaskData.h - * @brief task进程,缓存数据 + * @brief task进程,缓存数据(动态vector,按需分配) * @author your name (you@domain.com) - * @version 0.1 + * @version 0.2 * @date 2024-02-27 * * Copyright: Baosight Co. Ltd. * DO NOT COPY/USE WITHOUT PERMISSION - * */ #include namespace TaskShm { @@ -17,36 +16,26 @@ namespace bipc = mix_cc::shm::bip; const static std::string dir_path = "/users/dsc/shm"; const static std::string shm_file = "TaskData"; ///<映射文件名 -const double data_size = 500*10; ///< 数据大小 MB -const size_t MAX_LEN_DAYS = 30; ///<最多可放30天的数据 -const size_t DATA_COL_FRE = 50; ///<每秒采集数据点数 +const double data_size = 10; ///< 数据大小 MB(按需动态) + static bipc::managed_mapped_file obj_mapped_file(bipc::open_or_create, (dir_path + "/" + shm_file + "_boost.mmap").c_str(), mix_cc::data_size::MB(data_size)); -struct DataRecord { - float data_record[MAX_LEN_DAYS * 24 * 60 * 60 * DATA_COL_FRE]; +typedef bipc::managed_mapped_file::segment_manager segment_manager_t; +typedef bipc::node_allocator vec_allocator_f; +typedef boost::container::vector shm_vector_f; + +struct TaskRecord { + shm_vector_f data_record; + TaskRecord(const bipc::node_allocator &alloc) + : data_record(alloc) {} }; -/** - * @brief 记录的开始时间,结束时间,数据长度 - */ -struct TimeRecord { - int stime; - int etime; - size_t data_size; ///<数据长度 -}; /*单例 map 记录task数据项*/ -const static bipc::offset_ptr> TaskRecordPtr = - SHM::MapBuilder::find_or_construct(&obj_mapped_file, +const static bipc::offset_ptr> TaskRecordPtr = + SHM::MapBuilder::find_or_construct(&obj_mapped_file, shm_file); -/*单例 TimeRecord 保持 记录的起止时间*/ -// const static bipc::offset_ptr> TimeRecordPtr = -// SHM::MapBuilder::find_or_construct(&obj_mapped_file, -// shm_file); -/*单例 TimeRecord 保持 记录的起止时间*/ -// const static bipc::offset_ptr TimeRecordPtr = -// obj_mapped_file.find_or_construct("TimeRecord")(); } // namespace TaskShm