数据融合的并行计算

news2024/10/3 3:14:50

1、 数据融合的算法

数据融合的算法当中,需要对每一个格点i进行逐个计算,公式如下
在这里插入图片描述

2、出现的问题

但是随着背景场的空间分辨率的提高,格点数急剧增加。如空间分辨率为0.01°的话,那么15°✖15°的空间范围内就有1500✖1500个格点。那么在进行逐个格点计算的过程中,就非常耗时间。

3、编程

我先按照逐点计算并赋值给DataArray的点的思路进行编程。代码如下:

##对dataarray的每个点进行赋值
def change(da):
    for i in range(len(da.i.values)):
        for j in range(len(da.j.values)):
            da.loc[i,j] = i+j+3
            time.sleep(0.01)
import numpy as np
import xarray as xr
import time
if __name__ == '__main__':
    #构造一个dataarray
    n_wei = 1500
    data = np.random.rand(n_wei, n_wei)
    i = list(range(n_wei))
    j = list(range(n_wei))
    da = xr.DataArray(data, coords=[i, j], dims=["i", "j"])
    print(da)
    ###直接计算
    st0 = time.time()
    change(da)
    print('不并行用时:',time.time()-st0,'秒')

总共用时606秒。

4、Threading

然后为了能够节省时间,想要把逐点计算的第一层循环,即i循环分为好几个并行任务使用并行计算。我在这里使用了threading库,代码如下:

import math
def chunks(arr, m):   #把list arr分成m份,每份分给一个并行进程
    n = int(math.ceil(len(arr) / float(m)))
    return [arr[i:i + n] for i in range(0, len(arr), n)]

#对每个[ilist,j]纬度的dataarray进行change。
def start(da,ilist):
    for i in ilist:
        change(da,i)

##对dataarray的每个点进行赋值
def change(da,i):
    for j in range(len(da.j.values)):
        da.loc[i,j] = i+j+3

import numpy as np
import xarray as xr
import threading
import time
import os
#可能应该用multiprocessing而不是threading
if __name__ == '__main__':
    n_wei = 1500
    data = np.random.rand(n_wei, n_wei)
    i = list(range(n_wei))
    j = list(range(n_wei))
    da = xr.DataArray(data, coords=[i, j], dims=["i", "j"])
    print(da)
    ########开始并行
    st = time.time()
    #计算核数
    max_cpu = os.cpu_count()
    #设置并行数量
    para_n = max_cpu
    #把 i 行分为para_n个
    para_list = chunks(list(range(n_wei)),para_n)
    #设置并行任务
    threads = []
    for n in range(para_n):
        tmp = threading.Thread(target =start,args = (da,para_list[n]) )      ###用threading
        threads.append(tmp)
        tmp.start()
    for t in threads:
        t.join()
    #查看结果
    print(da)
    print('thread总线程数:',para_n,'用时:',time.time()-st,'秒')

总共用时648秒。
为啥用了threading以后反而更慢了呢?我觉得原因可能像这个博文所示。

5、改用array进行赋值

然后,有朋友建议用array进行循环赋值,会比用dataarray进行循环赋值要快。
那么,就试试,直接循环代码如下:

##对dataarray的每个点进行赋值
def change(da):
    for i in range(da.shape[0]):
        for j in range(da.shape[1]):
            da[i,j] = i+j+3

import numpy as np
import xarray as xr
import threading
import time
import multiprocessing
from multiprocessing import Pool
if __name__ == '__main__':
    #构造一个dataarray
    n_wei = 1500
    data = np.random.rand(n_wei, n_wei)
    ###直接计算
    st0 = time.time()
    change(data)
    print('不并行用时:',time.time()-st0,'秒')

用时0.48秒!

用了threading的代码如下:

import math
def chunks(arr, m):   #把list arr分成m份,每份分给一个并行进程
    n = int(math.ceil(len(arr) / float(m)))
    return [arr[i:i + n] for i in range(0, len(arr), n)]

#对每个[ilist,j]纬度的dataarray进行change。
def start(da,ilist,n_wei):
    for i in ilist:
        change(da,i,n_wei)

##对dataarray的每个点进行赋值
def change(da,i,n_wei=1000):
    for j in range(n_wei):
        da[i,j] = i+j+3

import numpy as np
import xarray as xr
import threading
import time
import os
#可能应该用multiprocessing而不是threading,但是multiprocessing不能在jupyter notebook里面用
if __name__ == '__main__':
    n_wei = 1500
    data = np.random.rand(n_wei, n_wei)
    i = list(range(n_wei))
    j = list(range(n_wei))
    print(data)
    ###如果不并行
    st0 = time.time()
    start(data,i,n_wei)
    print('不并行用时:',time.time()-st0,'秒')
    ########开始并行
    st = time.time()
    #计算核数
    max_cpu = os.cpu_count()
    #设置并行数量
    para_n = max_cpu
    #把 i 行分为para_n个
    para_list = chunks(list(range(n_wei)),para_n)
    #设置并行任务
    threads = []
    for n in range(para_n):
        tmp = threading.Thread(target =start,args = (data,para_list[n],n_wei) )      ###用threading
        threads.append(tmp)
        tmp.start()
    for t in threads:
        t.join()
    #查看结果
    print(data)
    print('总线程数:',para_n,'用时:',time.time()-st,'秒')

总共用时0.44秒!
啊,那是不是不用并行了,直接改用array循环赋值就行了?
然后,我把这个思路用在正式的数据融合计算中,结果发现,确实有节省时间,但是还是花费了很久,因为真正的数据融合计算中,每个格点的计算并不是像这个例子里面那么简单。
所以,我还是需要考虑并行计算的问题。接下来,参考和鲸社区的这个帖子进行并行计算的尝试。

6、multiprocessing和pool

首先有一点,jupyter notebook不支持multiprocessing,在jupyter notebook中使用multiprocessing只会卡住。
所以,只能用.py后缀名的文件使用Multiprocessing。
并且,为了测试Multiprocessing的并行计算是否节省了计算时间,在计算的时候,加上time.sleep(0.01)。
代码如下:

#!/usr/bin/env python
# coding: utf-8

# In[1]:

import math
def chunks(arr, m):   #把list arr分成m份,每份分给一个并行进程
    n = int(math.ceil(len(arr) / float(m)))
    return [arr[i:i + n] for i in range(0, len(arr), n)]


# In[2]:


#对每个[ilist,j]纬度的dataarray进行change。
def start(da,ilist):
    for i in ilist:
        change(da,i)


# In[3]:


##对dataarray的每个点进行赋值
def change(da,i):
    for j in range(da.shape[1]):
        da[i,j] = i+j+3
    time.sleep(0.1)



# In[ ]:


import numpy as np
import xarray as xr
import threading
import time
import multiprocessing
import os
from multiprocessing import Pool
#

#可能应该用multiprocessing而不是threading,但是multiprocessing不能在jupyter notebook里面用
if __name__ == '__main__':
    n_wei = 1500
    data = np.random.rand(n_wei, n_wei)
    i = list(range(n_wei))
    j = list(range(n_wei))
    # print(data)
    ###如果不并行
    st0 = time.time()
    start(data,i)
    print('不并行用时:',time.time()-st0,'秒')
    ########开始并行
    data = np.random.rand(n_wei, n_wei)
    st = time.time()
    ###
    max_cpu = os.cpu_count()
    #设置并行数量
    para_n = max_cpu
    #把 i 行分为para_n个
    para_list = chunks(list(range(n_wei)),para_n)
    #设置并行任务
    threads = []
    for n in range(para_n):
        tmp = multiprocessing.Process(target =start,args = (data,para_list[n]) )     ###用multiprocessing
        threads.append(tmp)
        tmp.start()
    for t in threads:
    #     print(threading.current_thread().name)
    #     t.setDaemon(True)
    #     t.start()
        t.join()
    #查看结果
    # print(data)
    print('总线程数:',para_n,'用时:',time.time()-st,'秒')
    # #####用pool试试
    data = np.random.rand(n_wei, n_wei)
    st1 = time.time()
    with Pool(max_cpu) as p:
        p.apply_async(change, args = (data,range(n_wei)) )
    p.close()
    p.join()
    # print(p,data)
    print('用pool:',time.time()-st1,'秒')

得到的结果如下:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1033521.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

003 linux 自动化构建工具-make/makefile

前言 本文将会向您介绍make/makefile的原理与操作 引入 首先先向您介绍linux的编译器gcc的编译过程: 预处理 预处理功能主要包括宏定义,文件包含,条件编译,去注释等。 预处理指令是以#号开头的代码行。 实例: gcc –E hello.c –o hello.i 选项“-E”,该选项的作…

iOS线上闪退问题解决方案

iOS线上闪退问题的收集工具是关键,它们可以帮助你及时发现和解决应用程序中的崩溃问题。以下是一些常用的iOS线上闪退问题收集工具及其使用方法,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合…

POJ 3977 Subset 折半枚举+二分搜素+双指针

一、题目大意 我们有N&#xff08;N<35&#xff09;个元素&#xff0c;从中选取一个子集&#xff0c;使得它的元素求和的绝对值最小&#xff0c;如果有多个可行解&#xff0c;选择元素最小的。 输出最优子集的元素总和绝对值&#xff0c;和最优子集元素的数量。 二、解题…

Google拟放弃博通自行研发AI芯片 | 百能云芯

谷歌计划自行研发人工智能&#xff08;AI&#xff09;芯片&#xff0c;考虑将博通&#xff08;Broadcom&#xff09;从其供应商名单中剔除&#xff0c;但谷歌强调双方的合作关系不会受到影响。 根据美国网络媒体《The Information》的报道&#xff0c;谷歌高层正在讨论可能在20…

窜货采买第三方怎么选择

窜货溯源服务听起来并不难&#xff0c;无非就是买货&#xff0c;但是否能买到货&#xff0c;同时在买到之后能否顺利完成溯源工作&#xff0c;也是非常有学问的&#xff0c;很多品牌会选择第三方服务商进行采买合作&#xff0c;这样可以规避品牌自己操作时的不合规性&#xff0…

Exploit-DB 使用小结

Exploit-DB &#xff08;网址&#xff1a;https://www.exploit-db.com&#xff09; 是一个漏洞库网站 &#xff0c;存储了大量的漏洞利用程序&#xff0c;可以帮助安全研究者和渗透测试工程师更好的进行安全测试工作&#xff0c;目前是世界上公开收集漏洞最全的数据库&#xff…

CNN(八):Inception V1算法实战与解析

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客 &#x1f356; 原作者&#xff1a;K同学啊|接辅导、项目定制 1 Inception V1 Inception v1论文 1.1 理论知识 GoogLeNet首次出现在2014年ILSVRC比赛中获得冠军。这次的版本通常称其为Inception V1。…

QtCreator报大量未知标识符错误的解决方法

目录 前言背景介绍问题1问题1解决方法问题2问题2 解决方法总结 前言 本文记录了在使用QtCreator开发时遇到的一个错误&#xff0c;导致编译时出现大量的“未知标识符”&#xff0c;经过一番努力最终解决了这个问题&#xff0c;特在此记录。 背景介绍 Qt项目在麒麟V10 系统下…

Linux中创建用户要自己设置密码

因为不知道Linux默认设置的密码&#xff0c;没办法接下来愉快的使用。如下&#xff1a; 而想要新建Linux用户密码&#xff0c;请您执行以下步骤: . 1.打开终端并以root身份登录; 2.输入命令“useradd username",其中username为您新建的用户名; 3.使用命令“passwd usernam…

《向量数据库指南》——向量搜索库Faiss 迁移到 Milvus 2.x

Faiss -> Milvus 2.x 1. Faiss 数据准备 前提条件是用户已经准备好了自己的 faiss 数据文件。(为了能快速体验,在项目源码的 testfiles 目录下放置了 faiss 测试数据方便用户体验: faiss_ivf_flat.index. 2. 编译打包 这部分同上,不再展开介绍。 3. 配置 migration.ymal…

【数据结构】顺序查找,折半查找,分块查找的知识点总结及相应的代码实现

目录 1、顺序查找 定义及步骤 代码实现 2、折半查找 定义及步骤 代码实现 折半查找判定树 3、分块查找 定义及步骤 1、顺序查找 定义及步骤 顺序查找的定义&#xff1a;从数据集合的起始位置开始&#xff0c;逐一比较每个数据元素&#xff0c;直到找到所要查找…

百度SEO优化不稳定的原因分析(提升网站排名的稳定性)

百度SEO优化不稳定介绍蘑菇号-www.mooogu.cn SEO不稳定是指网站在搜索引擎中的排名不稳定&#xff0c;随着时间的推移会发生变化。这种情况可能会出现在网站页面结构、内容质量、外链质量等方面存在缺陷或不合理之处。因此&#xff0c;优化SEO非常重要&#xff0c;可以提高网站…

4+机器学习+实验验证

今天给同学们分享一篇4机器学习实验验证的生信文章“Identification and Analysis of Neutrophil Extracellular Trap-Related Genes in Osteoarthritis by Bioinformatics and Experimental Verification”&#xff0c;这篇文章于2023年8月31日发表在 J Inflamm Res 期刊上&am…

两个数使用JavaScript比较大小;JavaScript知识点

一、两个数使用JavaScript比较大小代码 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><body><script type"text/javascript">var aprompt("请输入第一个数:"…

Web自动化测试 —— 如何进行Selenium页面数据及元素交互?啊哈

前言&#xff1a; Web自动化测试是一种常用的测试方式&#xff0c;通过在浏览器中模拟用户操作以及与页面元素的交互&#xff0c;可以有效地检验页面的功能性以及稳定性。Selenium是一款流行的Web自动化测试工具&#xff0c;在本篇文章中&#xff0c;我们将介绍如何使用Seleni…

青大数据结构【2022】

关键字&#xff1a; next数组、下三角矩阵、完全二叉树结点、静态分布动态分布、迪杰斯特拉最短路径、二叉排序树失败ASL、排序比较、二叉排序树中序遍历、链表删除最大值 一、单选 二、简答 三、应用 四、算法分析 五、算法设计

nginx反向代理vue项目

文章目录 前言一、创建站点1.添加站点2.添加ssl证书 二、反向代理vue项目1.添加反向代理2.更改vue项目配置3.修改反向代理配置 前言 项目描述&#xff1a;前端vue项目、后端Java项目、首页WordPress项目 客户要求&#xff1a;使用宝塔进行部署 需求描述&#xff1a;客户只有一…

【Java】Servlet API

Servlet API HttpServlet核心方法Servlet生命周期 HttpServletRequest核心方法 HttpServletResponse核心方法 HttpServlet 我们写 Servlet 代码的时候, 首先第一步就是先创建类, 继承自 HttpServlet, 并重写其中的某些方法. 核心方法 方法名称调用时机init在 HttpServlet 实…

李宏毅机器学习第一课

机器学习就是让机器找一个函数f&#xff0c;这个函数f是通过计算机找出来的 如果参数少的话&#xff0c;我们可以使用暴搜&#xff0c;但是如果参数特别多的话&#xff0c;我们就要使用Gradient Descent Regression (输出的是一个scalar数值) Classification &#xff08;在…

美团2024届秋招笔试第一场编程[汇总](上课口胡一下)

一.小美的好矩阵 口胡&#xff1a;模拟题&#xff0c;数据和题意灰常清楚。 俩层循环枚举每个3&#xfe61;3的小矩阵&#xff0c;然后枚举每个小矩阵&#xff0c;12个if判断俩俩相邻的字符是否相等。这里有个技巧&#xff1a;拿出中间的字符&#xff0c;这样就能使用一个偏移…