如题 如何在多线程中手动进行数据合并

缘起

笔者不喜欢ROOT,也不太会用。对于小规模的数据,使用CSV存储查看起来更为方便。但是在Geant4中使用csv存储似乎不支持数据的自动合并。也就是说在面对多线程任务时,输出数据是一个困难。

而且,如果在RunAction或者main()中进行文件读写,会出现多个线程同时读写同一文件的情况,如果没有加文件锁,很容易报错。

问题的关键

笔者发现Geant4的每一个线程都会执行一遍main(){}以及RunAction(){}中的内容,这会给多线程数据手动合并带来困扰。因为难以判断当前是哪一个线程在执行什么,并且在上述地方使用GetThreadID()也并不能正确获取ID。

问题的钥匙

Geant4中,线程分为1个主线程和若干个工作线程。在RunAction中的内容,先由工作线程执行一遍,随即由主线程再执行一遍。因此获取ThreadID的结果总会被主线程的ThreadID=-1说覆盖。

在Geant4.10版本,可以在RunAction中使用 IsMaster() 来判断是否在主线程,因此这也是解决手动数据合并的钥匙。

笔者的做法

在RunAction类中创建静态变量,在RunAction.cc的RunAction::EndOfRunAction(const G4Run* run)使用IsMaster判断是否为主线程,并在工作线程的地方累加静态变量,在Master中进行数据输出和文件读写。

大概逻辑如下:

// in RunAction.hh
class RunAction : public G4UserRunAction
{public:RunAction();virtual ~RunAction();virtual void BeginOfRunAction(const G4Run*);virtual void   EndOfRunAction(const G4Run*);private:G4String OutputFileName;static std::vector<G4double> TotalEdepInSensors; // 创建静态变量存储数据
};// in RunAction.cc
// 初始化静态成员变量,类内声明,内外定义(全局),定义的格式如下
std::vector<G4double> RunAction::TotalEdepInSensors(0); RunAction::SFFSRunAction(){...
}...void RunAction::EndOfRunAction(const G4Run* run)
{if(IsMaster()){// 主线程执行该段// 进行数据导出或文件读写std::ofstream results_file; results_file.open("data.csv");results_file << TotalEdepInSensors[1] << std::endl;results_file.close();std::fill(this->TotalEdepInSensors.begin(), this->TotalEdepInSensors.end(), 0);// 重新置0,为下一次run做准备}else{// 每个工作线程都会执行该段// 在这里进行数据合并TotalEdepInSensors[1] += Edep;
}

Geant4.10 多线程 手动数据合并相关推荐

  1. Tableau数据合并

    当需要将有多个结构一致的数据表整合汇总在一起时,则可以使用数据合并.数据联接是横向扩展,数据合并是纵向增加. 进行数据合并的要求是,每个数据表的字段名.个数.顺序和数据类型必须完全一致. 为了简单直观 ...

  2. 数据科学 IPython 笔记本 7.10 组合数据集:合并和连接

    7.10 组合数据集:合并和连接 原文:Combining Datasets: Merge and Join 译者:飞龙 协议:CC BY-NC-SA 4.0 本节是<Python 数据科学手册 ...

  3. 栈数据合并——华为2023.5.10

    题目描述 向一个空栈压入正整数,每当压入一个整数时,执行以下规则(设:栈顶至栈底整数依次编号为n1.n2-nx,n1为最新压入的整数) 1.如果n1=n2,则n1.n2全部出栈,压入新数据m(m=2× ...

  4. 多帧点云数据拼接合并_多工作簿数据合并,还在手动复制粘贴就out了,用批处理一键搞定...

    相信许多朋友都有碰到过将多个工作簿文件数据合并到一张表的情况,这种情况下许多朋友想尽各种办法,复制粘贴也好.vba多表合并也罢,但是合并数据总感觉需要耗费很多时间. 如上图所示,我们需要将1-8月8个 ...

  5. pandas之数据合并

    在数据处理中,不免会遇到数据之间的合并.学过关系数据库的童鞋应该都清楚数据表之间的连接.今天要说的数据合并其实和数据表之间的连接有很多相似之处.由于 pandas 库在数据分析中比较方便而且用者较多, ...

  6. Excel数据合并(追加写入)

    Excel数据合并(追加写入) 数据合并 两表合并 只用pandas包实现 用xlrd包实现 普通的文件读写 总结 多表数据合并 数据合并 两表合并 已知a c两个都含有数据的xlsx文件要求:将a文 ...

  7. python数据分析:数据拆分,数据合并,数据筛选

    #基于Python的数据分析 #1:为什么要进行数据分析 #简答:人工智能.大数据等数据的采集需要数据----数据通过Python分析 # 而来------进行数据的清洗操作-----建立数据模型Mo ...

  8. 【Dash搭建可视化网站】项目10:疫情数据可视化大屏制作步骤详解

    疫情数据可视化大屏制作步骤详解 1 项目效果图 2 项目架构 3 文件介绍和功能完善 3.1 assets文件夹介绍 3.2 app.py和index.py文件完善 3.3 header.py文件完善 ...

  9. JAVA 笔记 10 多线程

    进程 与 线程 进程 进程资源分配的最小单位,CPU从磁盘中读取一段程序到内存中,该执行程序的实例就叫做进程; 一个程序如果被CPU多次读取到内存中,则变成多个独立的进程. 线程 线程是程序执行的最小 ...

最新文章

  1. Spring Cloud 2020.0.3 发布!
  2. Oracle: 数字前面自动补0几种方式
  3. 中国已消失的九所世界级大学
  4. 虚拟机登陆别的服务器吗,云服务器只能用虚拟机登录吗
  5. 通过Service访问应用 (2)
  6. 用 S5PV210 学习 Linux (一) 刷机(一)
  7. linux调度器(三)——周期性调度器与CFS
  8. python处理excel数据计算_Python处理Excel数据
  9. CryptoJS加密使用
  10. PYTHON判断回文素数
  11. 视频插帧论文阅读(一)——FLAVR
  12. 什么叫工作波长,截止波长和波导波长
  13. 智能优化算法应用:基于麻雀搜索优化K-means图像分割算法 - 附代码
  14. 经典点云配准算法:迭代最近点算法ICP(Iterative Closest Point)
  15. 员工提出辞职后又不想走了,是否可以反悔
  16. 数图互通高校房产管理——房屋模拟分配建设
  17. 计算机大写改成拼音形式,Excel将汉字名字,转换为大写的拼音,全称
  18. win10系统,主机箱的前置耳麦插孔用不了,“设置——声音”麦克风或者耳机已拔出未修复,“输入设备”无插座信息,更新驱动也无效,控制面板——小图标里查不到realtek高清晰音频管理器——一招解决
  19. 交易员怎样于牛市中基于KDJ进行选股
  20. 2020年服务器的七个发展趋势:数据为王、特定领域的CPU将崛起、机架密度新增一倍以上……...

热门文章

  1. 华为又发新品?这几款功能太优秀了
  2. Cisco PIX防火墙配置指南
  3. matlab spmd,matlab并行计算命令
  4. 拜耳建立细胞和基因治疗平台,加速处方药创新
  5. eclipse启动一个Springboot项目
  6. django怎么读python_在Python中的Django框架中进行字符串翻译
  7. 查询高考录取结果显示服务器错误,又有一大批考生被录取!你还显示 “未查询到录取信息”吗?...
  8. 写了一个随机图片API接口,用来做博客园随机背景,欢迎使用,禁止爬取,需要套图可以直接联系博主...
  9. 10种最不健康的生活方式(转)
  10. mongodb 5.0 启动报错 Package ‘mongodb-org-server‘ isn‘t signed with proper key