首页 > 其他分享 >MPI Library for .Net

MPI Library for .Net

时间:2024-02-01 09:04:05浏览次数:30  
标签:ProcessParallel Run items Library MPI 进程 Net 多线程

今天整点.Net。因为在某个业余小项目中,需要尽可能榨干硬件性能,以满足尽可能大的可访问数据范围。

发现在.Net中并行计算一般使用System.Threading.Task.Parallel,但实际开发中,似乎只能处理到1G左右的数据就会溢出,机器整个状态似乎只是在摸鱼。并且拥有多台物理机器的时候并不能共享计算资源。

第一步,将多线程的程序改为多进程+多线程。输入是一个文件路径列表,是一堆pdf。需要使用OCR识别pdf内嵌图片中的内容,输入大模型完成校准,输出校准后的txt,后续成为构建向量数据库用的基础数据。

多线程好办,直接用Parallel干就好了。多进程多少有些麻烦。主要困难的点在于进程间数据共享。解决这种困难第一时间去找开源库,然鹅并没有这种的。因为写python的时候joblib里面Parallel一下,delayed一个表达式搞定的事情,在.Net并没有类似的东西。随即写了一个。叫做MPILibrary。实际上真的要做MPI很复杂,有专门一个学科研究这东西,这里姑且用这个名字了。

发布在nuget了,MIT License,直接可以搜来使用,自用商用都行。

NuGet Gallery | MPILibrary 1.0.4

源码开放在Github

lu1770/MPILibrary (github.com)

基本做法比较简单,第一步,开一个可执行程序,在Main函数开头加上子进程处理逻辑:

if (ProcessParallel.IsSubProcess())
{
    ProcessParallel.Handle();
    return;
}

  

第二步,定义一个静态方法,本来想做成支持lambda表达式失败了,先用静态方法好了。

class Runner
{
    public static object Run(string id)
    {
        return new
        {
            CommandLineArgs = Environment.GetCommandLineArgs(),
            Message = $"input is {id}, process id is {Process.GetCurrentProcess().Id}",
            Time=DateTime.Now.ToShortTimeString()
        };
    }
}

第三步,传入待处理数据,启动执行。

// Generate Items
var items = Enumerable.Range(1, 200).Select(i => Guid.NewGuid().ToString());

// Show MaxProcessLimit
Console.WriteLine($"Start {ProcessParallel.MaxProcessLimit}");

// Run
List<object> results = ProcessParallel.ForEach(items, Runner.Run).ToList();

// Show Results
Console.WriteLine(JsonConvert.SerializeObject(results, Formatting.Indented));

这里items中每个元素会开一个专门的进程执行Run,这样单进程内存上限差不多是1.2G。

处理完成之后,从Run返回的结果会作为元素存放在results里面,这里出来的结果是乱序的,对顺序敏感的话,可以设计一个特别的keypair的返回结构自行实现完成后排序。

MaxProcessLimit这个用于控制进程数的,默认使用当前机器CPU内核数,防止实际编程忽略此设置,实现又过于奔放,把机器玩没了的情况。当然,如果实际items特别少,机器性能又超强的情况下使用int.MaxValue也未尝不可。实际测试下来默认值效果最好,默认值1.5倍会有鼠标键盘操作无响应的情况,酌情使用把。

进程间通信使用JSON格式的,所以输入输出的格式需要可以被JSON序列化的结构。

未来版本,考虑使用以太网实现多物理机的IPC,这样多台机器组合并行,通过修改一个配置项,获得相当可观的计算能力。

老板们有需要直接提issue把,有用的会抽空去做。

 

 

 

标签:ProcessParallel,Run,items,Library,MPI,进程,Net,多线程
From: https://www.cnblogs.com/lu1770/p/18000473

相关文章

  • 北京兴达易控EtherNET转Profinet网关
    北京兴达易控EtherNET主站转Profinet网关是一种能将EtherNET协议和Profinet协议相互转换的设备,将网络通信技术与工业自动化技术完美结合。它不仅简化了通信的复杂度,而且提高了系统的可靠性和稳定性。作为一个EtherNET主站转Profinet网关,它能够将不同网络之间的数据进行转换和传......
  • EtherNET转Profinet网关在AB系统的配置方法
    EtherNET转Profinet网关是用于连接EtherNET和Profinet两种网络协议的设备。它充当了一个重要的中转桥梁,实现了两种不同协议之间的互相通信和数据交换。在工业自动化控制系统中,这种网关的应用非常广泛,能够满足各种复杂的通信需求。由于现场不同会出现使用系统的差异,下面介绍EtherNE......
  • Install nfs (network file system)
    1.whatisnfsusedfor?nfsisnetworkfilesystem,itisusedwhenmultiplecomputersneedtoaccessonedirectory.2.ComputerEnvironmentOS:Ubuntu20.043.Installandconfignfsserver3.1.Installnfsserver#执行以下命令安装NFS服务器,​#apt会自动安装......
  • Pdfium.Net.Free 一个免费的Pdfium的 .net包装器--签名
    项目地址:Pdfium.Net:https://github.com/1000374/Pdfium.NetPdfiumViewer:https://github.com/1000374/PdfiumViewer获取PDF签名信息,不知如何解析签名内容,所以组件没办法做验签。只能获取获取签名个数、编码、原因、时间等基本信息,有知道的大佬可以共同探讨下签名信息包括:签名......
  • Pdfium.Net.Free 一个免费的Pdfium的 .net包装器--删除或编辑pdf内容
    项目地址:Pdfium.Net:https://github.com/1000374/Pdfium.NetPdfiumViewer:https://github.com/1000374/PdfiumViewer如需删除或者编辑pdf中的内容,首先要获取pdf内需要修改或者删除的对象,所有对页面编辑操作都需要调用GenerateContent函数方才生效获取pdf所有对象的方法:返回的信......
  • CSharp: create pdf file using iText 8.0 in donet 8.0
     /*IDE:VS202217.5OS:windows10.net8.0iText8.0System.Text.Encoding.CodePages*/namespaceConsoleAppPdfdemo{usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.IO;usingSystem.Text;......
  • IRNet
    IRNet论文:https://openaccess.thecvf.com/content_CVPR_2019/papers/Ahn_Weakly_Supervised_Learning_of_Instance_Segmentation_With_Inter-Pixel_Relations_CVPR_2019_paper.pdfIRNet论文解读:https://zhuanlan.zhihu.com/p/246105364图像分割弱监督技术综述:https://blog.csdn......
  • RetinaNet
    论文:https://openaccess.thecvf.com/content_ICCV_2017/papers/Lin_Focal_Loss_for_ICCV_2017_paper.pdf讲解(含代码讲解):https://zhuanlan.zhihu.com/p/410436667论文解读:https://zhuanlan.zhihu.com/p/466853103交叉熵损失函数:https://blog.csdn.net/weixin_45665708/article/......
  • PANet
    PANetPANet论文解读:https://zhuanlan.zhihu.com/p/392913269实例分割网络发展:https://zhuanlan.zhihu.com/p/141685352论文原地址:https://openaccess.thecvf.com/content_cvpr_2018/papers/Liu_Path_Aggregation_Network_CVPR_2018_paper.pdfPANet可以看做在maskRCNN上面做......
  • 用批处理写的Telnet后门永不被杀
    脚本宝典收集整理的这篇文章主要介绍了用批处理写的后门永不被杀,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。代码思路是影子鹰DESERT朋友的,原代码比较麻烦,我做了改进,这个后门优点就是小而且不会被杀,放到SysTEM32目录下就可以了,代码如下: @echo off @attrib +s......