国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Python使用多線程操作tif影像和HBase數(shù)據(jù)庫(kù)

這篇具有很好參考價(jià)值的文章主要介紹了Python使用多線程操作tif影像和HBase數(shù)據(jù)庫(kù)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

本文介紹使用Python的多線程技術(shù),提高h(yuǎn)appybase模塊和gdal模塊的效率,從tif格式的影像文件中讀取數(shù)據(jù),并將其存儲(chǔ)到HBase數(shù)據(jù)庫(kù)中。主要步驟包括:

  • 準(zhǔn)備工作:安裝Python環(huán)境,安裝happybase模塊和gdal模塊,安裝HBase數(shù)據(jù)庫(kù),并準(zhǔn)備tif影像文件。
  • 讀取tif影像數(shù)據(jù):使用readTif函數(shù)讀取tif影像數(shù)據(jù)集,并獲取其寬度、高度、波段數(shù)、數(shù)據(jù)數(shù)組、仿射變換參數(shù)和投影信息。遍歷tif影像文件所在的文件夾,獲取tif影像文件的日期和分塊信息。
  • 寫入HBase數(shù)據(jù)庫(kù):創(chuàng)建一個(gè)happybase連接對(duì)象,并獲取或創(chuàng)建一個(gè)happybase表對(duì)象。遍歷每個(gè)分塊,使用readTif函數(shù)讀取每個(gè)分塊的每個(gè)日期的每個(gè)波段的數(shù)據(jù),并將其存儲(chǔ)到一個(gè)三維的numpy數(shù)組中。遍歷每個(gè)像素,將其對(duì)應(yīng)的每個(gè)波段的每個(gè)日期的數(shù)據(jù)組合成一個(gè)字典,作為HBase表中的列值。使用分塊編號(hào)、行號(hào)和列號(hào)拼接成一個(gè)字符串,作為HBase表中的行鍵。使用put方法將行鍵和列值寫入HBase表中。關(guān)閉happybase連接對(duì)象。
  • 使用多線程技術(shù):導(dǎo)入threading模塊,創(chuàng)建一個(gè)信號(hào)量對(duì)象,用于限制線程的最大數(shù)量。遍歷每個(gè)分塊,使用信號(hào)量對(duì)象的acquire方法獲取一個(gè)信號(hào)量,然后創(chuàng)建一個(gè)新的線程對(duì)象,并指定目標(biāo)函數(shù)為load函數(shù),以及傳遞分塊編號(hào)、分塊列表和日期列表作為參數(shù)。然后調(diào)用start方法啟動(dòng)該線程。在load函數(shù)中,在完成數(shù)據(jù)的讀取和寫入后,使用信號(hào)量對(duì)象的release方法釋放一個(gè)信號(hào)量,并關(guān)閉happybase連接對(duì)象。記錄程序運(yùn)行的開(kāi)始時(shí)間和結(jié)束時(shí)間,并計(jì)算程序運(yùn)行的總時(shí)間。

一、環(huán)境準(zhǔn)備

  • 安裝Python環(huán)境,本文使用的是Anaconda3。
  • 安裝happybase模塊,可以使用pip或conda命令。例如:
pip install happybase
  • 安裝gdal模塊,可以使用pip或conda命令。例如:
conda install gdal
  • 啟動(dòng)分布式集群,hadoop以及hbase;啟動(dòng)thrift服務(wù),可以使用hbase-daemon.sh腳本。例如:
hbase-daemon.sh start thrift

就可以使用happybase模塊連接到thrift服務(wù),并操作HBase數(shù)據(jù)庫(kù)了?

  • 準(zhǔn)備tif格式的影像文件,并放在一個(gè)文件夾中。本文使用的是Sentinel-2衛(wèi)星的10個(gè)波段的影像數(shù)據(jù),分為多個(gè)日期和多個(gè)分塊。

Python使用多線程操作tif影像和HBase數(shù)據(jù)庫(kù)

二、定義讀取tif影像數(shù)據(jù)的函數(shù)

  • 導(dǎo)入需要的模塊,包括time、happybase、gdal、numpy、pandas、os、tqdm和threading。例如:
import time
import happybase
from osgeo import gdal
import numpy as np
import pandas as pd
import os
from tqdm import tqdm
import threading
  • 定義一個(gè)函數(shù)readTif,用于讀取tif格式的影像數(shù)據(jù)集,并返回其寬度、高度、波段數(shù)、數(shù)據(jù)數(shù)組、仿射變換參數(shù)和投影信息。例如:
#  讀取tif數(shù)據(jù)集
def readTif(fileName, xoff=0, yoff=0, data_width=0, data_height=0):
    dataset = gdal.Open(fileName)
    num_bands = dataset.RasterCount
    # print(num_bands)
    if dataset == None:
        print(fileName + "文件無(wú)法打開(kāi)")
    #  柵格矩陣的列數(shù)
    width = dataset.RasterXSize
    #  柵格矩陣的行數(shù)
    height = dataset.RasterYSize
    #  波段數(shù)
    bands = dataset.RasterCount
    #  獲取數(shù)據(jù)
    if (data_width == 0 and data_height == 0):
        data_width = width
        data_height = height
    data = dataset.ReadAsArray(xoff, yoff, data_width, data_height)
    #  獲取仿射矩陣信息
    geotrans = dataset.GetGeoTransform()
    #  獲取投影信息
    proj = dataset.GetProjection()
    return width, height, bands, data, geotrans, proj
  • ?獲取tif影像文件所在的文件夾路徑,并遍歷該文件夾下所有以.tif為后綴名的文件。例如:
# 分塊影像所在文件夾,不能有中文
tifDir = r"E:\pyimg\tif2csv\S2SR10mallband3tile"
tifs = [i for i in os.listdir(tifDir) if i.endswith(".tif")]
print("有 %s 個(gè)tif文件" % len(tifs))
  • ?獲取tif影像文件的日期和分塊信息,并去重排序。例如:
# 獲取目標(biāo)文件數(shù)量,前綴相同的
bandlist=['B2','B3','B4','B5','B6','B7','B8','B8A','B11','B12']
datelist1 = []
fenkuailist1 = []
for i in tifs:
    datelist1.append(i[:-26])
    fenkuailist1.append(i[-25:-4])

datelist = list(set(datelist1))
datelist.sort(key=datelist1.index)
fenkuailist = list(set(fenkuailist1))
fenkuailist.sort(key=fenkuailist1.index)
print("有 %s 個(gè)日期" % len(datelist))
print("datelist" , datelist)
print("每個(gè)日期 %s 個(gè)塊" % len(fenkuailist))
print("fenkuailist" , fenkuailist)

三、創(chuàng)建happybase連接和表對(duì)象

  • 創(chuàng)建一個(gè)happybase連接對(duì)象,并指定HBase數(shù)據(jù)庫(kù)的IP地址。例如:
connection = happybase.Connection('192.168.1.100')
# # before first use:
connection.open()
  • 獲取或創(chuàng)建一個(gè)happybase表對(duì)象,并指定表名和列族名。例如:
table = connection.table('rawdata')

四、定義寫入HBase數(shù)據(jù)庫(kù)的函數(shù)

  • 定義一個(gè)函數(shù)load,用于讀取和寫入一個(gè)分塊的數(shù)據(jù)。該函數(shù)接受分塊編號(hào)、分塊列表和日期列表作為參數(shù)。該函數(shù)的主要步驟如下:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-494494.html

    • 打印當(dāng)前分塊的編號(hào)。
    • 初始化一個(gè)三維的numpy數(shù)組,用于存儲(chǔ)該分塊的所有波段和所有日期的數(shù)據(jù)。
    • 遍歷每個(gè)日期,使用readTif函數(shù)讀取該分塊的每個(gè)日期的每個(gè)波段的數(shù)據(jù),并將其存儲(chǔ)到numpy數(shù)組中。
    • 打印寫入中的提示。
    • 遍歷每個(gè)像素,將其對(duì)應(yīng)的每個(gè)波段的每個(gè)日期的數(shù)據(jù)組合成一個(gè)字典,作為HBase表中的列值。使用分塊編號(hào)、行號(hào)和列號(hào)拼接成一個(gè)字符串,作為HBase表中的行鍵。使用put方法將行鍵和列值寫入HBase表中。
    • 關(guān)閉happybase連接對(duì)象。
def load(kuai,fenkuailist,datelist):
        connection = happybase.Connection('192.168.1.100')
        # # before first use:
        connection.open()
        table = connection.table('rawdata')
        
        print("(%d/%d)塊編號(hào):"%(kuai+1,len(fenkuailist)),fenkuailist[kuai])
        # 初始化立方體
        img_file = tifDir + "\\" + datelist[0] + "-" + fenkuailist[kuai] + ".tif"
        im_width, im_height, im_bands, im_data, kuai_im_geotrans, kuai_im_proj = readTif(img_file)

        tmpttt = np.empty((im_bands, im_width * im_height, len(datelist)))
    # print("波段 %s 個(gè)" % im_bands)
    # print("行列數(shù)", im_width, im_height)
        for shijian in range(len(datelist)):
        #  圖像
            img_file = tifDir + "\\" + datelist[shijian] + "-" + fenkuailist[kuai] + ".tif"
            # print(img_file)
            im_width, im_height, im_bands, im_data, im_geotrans, im_proj = readTif(img_file)
            kuai_im_geotrans = im_geotrans
            kuai_im_proj=im_proj

            for j in range(im_bands):
                tmpttt[j, :, shijian] = im_data[j].flatten(order='C')
        print("寫入中...")
        for index in tqdm(range(im_width * im_height)):
            dt={}
            for ban in range(im_bands):
                d1=zip(map(lambda  x:"f1:"+x+bandlist[ban],datelist),tmpttt[ban, index, :].astype(str))
            # Converting zip object to dict using dict() contructor.
                dt.update(d1)
            key=str(kuai%3)+fenkuailist[kuai][6:10]+fenkuailist[kuai][-4:]+str(index)
            table.put(key, dt)  # 提交數(shù)據(jù),0001代表行鍵,寫入的數(shù)據(jù)要使用字典形式表示
        connection.close()  # 關(guān)閉傳輸

五、使用多線程技術(shù)

  • 導(dǎo)入threading模塊,該模塊提供了多線程的支持,可以創(chuàng)建和管理線程,以及實(shí)現(xiàn)線程間的同步和通信。
  • 使用time模塊的perf_counter函數(shù),記錄程序運(yùn)行的開(kāi)始時(shí)間。例如:
# #計(jì)時(shí)開(kāi)始
start = time.perf_counter()
  • 使用threading模塊的Semaphore類,創(chuàng)建一個(gè)信號(hào)量對(duì)象,用于限制線程的最大數(shù)量。信號(hào)量對(duì)象有一個(gè)內(nèi)部計(jì)數(shù)器,每當(dāng)一個(gè)線程調(diào)用acquire方法時(shí),計(jì)數(shù)器減一,每當(dāng)一個(gè)線程調(diào)用release方法時(shí),計(jì)數(shù)器加一。如果計(jì)數(shù)器為零,那么acquire方法將阻塞,直到其他線程調(diào)用release方法。例如:
sem=threading.Semaphore(5) #限制線程的最大數(shù)量為5
  • 遍歷每個(gè)分塊,使用sem對(duì)象的acquire方法獲取一個(gè)信號(hào)量,然后使用threading模塊的Thread類,創(chuàng)建一個(gè)新的線程對(duì)象,并指定目標(biāo)函數(shù)為load函數(shù),以及傳遞分塊編號(hào)、分塊列表和日期列表作為參數(shù)。然后調(diào)用start方法啟動(dòng)該線程。例如:
for kuai in range(30,72):
    sem.acquire()
    threading.Thread(target = load, args = (kuai,fenkuailist,datelist)).start()
  • 在load函數(shù)中,在完成數(shù)據(jù)的讀取和寫入后,使用sem對(duì)象的release方法釋放一個(gè)信號(hào)量,并關(guān)閉happybase連接對(duì)象。例如:
def load(kuai,fenkuailist,datelist):
        connection = happybase.Connection('192.168.1.100')
        # # before first use:
        connection.open()
        table = connection.table('rawdata')
        
        print("(%d/%d)塊編號(hào):"%(kuai+1,len(fenkuailist)),fenkuailist[kuai])
        # 初始化立方體
        img_file = tifDir + "\\" + datelist[0] + "-" + fenkuailist[kuai] + ".tif"
        im_width, im_height, im_bands, im_data, kuai_im_geotrans, kuai_im_proj = readTif(img_file)

        tmpttt = np.empty((im_bands, im_width * im_height, len(datelist)))
    # print("波段 %s 個(gè)" % im_bands)
    # print("行列數(shù)", im_width, im_height)
        for shijian in range(len(datelist)):
        #  圖像
            img_file = tifDir + "\\" + datelist[shijian] + "-" + fenkuailist[kuai] + ".tif"
            # print(img_file)
            im_width, im_height, im_bands, im_data, im_geotrans, im_proj = readTif(img_file)
            kuai_im_geotrans = im_geotrans
            kuai_im_proj=im_proj

            for j in range(im_bands):
                tmpttt[j, :, shijian] = im_data[j].flatten(order='C')
        print("寫入中...")
        for index in tqdm(range(im_width * im_height)):
            dt={}
            for ban in range(im_bands):
                d1=zip(map(lambda  x:"f1:"+x+bandlist[ban],datelist),tmpttt[ban, index, :].astype(str))
            # Converting zip object to dict using dict() contructor.
                dt.update(d1)
            key=str(kuai%3)+fenkuailist[kuai][6:10]+fenkuailist[kuai][-4:]+str(index)
            table.put(key, dt)  # 提交數(shù)據(jù),0001代表行鍵,寫入的數(shù)據(jù)要使用字典形式表示
        connection.close()  # 關(guān)閉傳輸
        sem.release()
  • 使用time模塊的perf_counter函數(shù),記錄程序運(yùn)行的結(jié)束時(shí)間,并計(jì)算程序運(yùn)行的總時(shí)間。例如:
# #計(jì)時(shí)結(jié)束
delta = time.perf_counter()-start
print("程序運(yùn)行的時(shí)間是:{}秒".format(delta))

到了這里,關(guān)于Python使用多線程操作tif影像和HBase數(shù)據(jù)庫(kù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • SQLITE_BUSY 是指 SQLite 數(shù)據(jù)庫(kù)返回的錯(cuò)誤碼,表示數(shù)據(jù)庫(kù)正在被其他進(jìn)程或線程使用,因此當(dāng)前操作無(wú)法完成。

    當(dāng)多個(gè)進(jìn)程或線程同時(shí)嘗試對(duì)同一個(gè) SQLite 數(shù)據(jù)庫(kù)進(jìn)行寫操作時(shí),就可能出現(xiàn) SQLITE_BUSY 錯(cuò)誤。這是為了確保數(shù)據(jù)庫(kù)的數(shù)據(jù)完整性和一致性而設(shè)計(jì)的并發(fā)控制機(jī)制。 如果你在使用 SQLite 時(shí)遇到 SQLITE_BUSY 錯(cuò)誤,可以考慮以下解決方法: 重試操作:在捕獲到 SQLITE_BUSY 錯(cuò)誤后,可以

    2024年02月09日
    瀏覽(22)
  • 基于pyqt5+opencv實(shí)現(xiàn)16位tif影像轉(zhuǎn)jpg

    基于pyqt5+opencv實(shí)現(xiàn)16位tif影像轉(zhuǎn)jpg

    現(xiàn)在大部分圖像軟件都支持tiff影像的瀏覽,但都是僅限于8位的影像,對(duì)應(yīng)CV16U類型的tiff影像并不支持(這需要專業(yè)的gis軟件才可進(jìn)行操作)。為了便捷操作,故此基于pyqt5+opencv實(shí)現(xiàn)16位tif影像轉(zhuǎn)jpg的軟件。 本博文涉及基于ui文件直接構(gòu)建界面、實(shí)現(xiàn)文件拖拽打開(kāi)、按鈕組狀態(tài)

    2024年02月12日
    瀏覽(23)
  • Python讀取hbase數(shù)據(jù)庫(kù)

    Python讀取hbase數(shù)據(jù)庫(kù)

    1. hbase連接 首先用hbase shell 命令來(lái)進(jìn)入到hbase數(shù)據(jù)庫(kù),然后用list命令來(lái)查看hbase下所有表,以其中表“DB_level0”為例,可以看到庫(kù)名“baotouyiqi”是拼接的,python代碼訪問(wèn)時(shí)先連接: 備注:完整代碼在最后,想運(yùn)行的直接滑倒最后復(fù)制即可 2. 按條件讀取hbase數(shù)據(jù) 然后按照條件

    2024年04月09日
    瀏覽(16)
  • python——數(shù)據(jù)庫(kù)操作PyMysql使用詳解

    勸君惜取少年時(shí) 在編寫小腳本時(shí),PyMysql是快速連接并操作數(shù)據(jù)庫(kù)的一個(gè)不錯(cuò)選擇。 連接數(shù)據(jù)庫(kù) 使用connect函數(shù)創(chuàng)建連接對(duì)象,此連接對(duì)象提供關(guān)閉數(shù)據(jù)庫(kù)、事務(wù)回滾等操作 一般傳參為:host, user, password, port(默認(rèn)為3306), database(想要連接的數(shù)據(jù)庫(kù)名) 連接對(duì)象的常見(jiàn)方法 :

    2024年02月02日
    瀏覽(21)
  • 零基礎(chǔ)學(xué)Python|Python高階-使用Python操作數(shù)據(jù)庫(kù)

    零基礎(chǔ)學(xué)Python|Python高階-使用Python操作數(shù)據(jù)庫(kù)

    ? 作者主頁(yè):編程指南針 作者簡(jiǎn)介:Java、前端、Python開(kāi)發(fā)多年,做過(guò)高程,項(xiàng)目經(jīng)理,架構(gòu)師 主要內(nèi)容:Java項(xiàng)目開(kāi)發(fā)、畢業(yè)設(shè)計(jì)開(kāi)發(fā)、面試技術(shù)整理、最新技術(shù)分享 收藏點(diǎn)贊不迷路 關(guān)注作者有好處 文末獲得源碼 數(shù)據(jù)庫(kù)作為存儲(chǔ)系統(tǒng)數(shù)據(jù)的主要工具,擔(dān)負(fù)著數(shù)據(jù)持久化存

    2024年02月10日
    瀏覽(22)
  • 使用IDEA連接hbase數(shù)據(jù)庫(kù)

    ? Hbase是安裝在另一臺(tái)LINUX服務(wù)器上的,需要本地通過(guò)JAVA連接HBase數(shù)據(jù)庫(kù)進(jìn)行操作。由于是第一次接觸HBase,過(guò)程當(dāng)中百度了很多資料,也遇到了很多的問(wèn)題。耗費(fèi)了不少時(shí)間才成功連接上。特記錄下過(guò)程當(dāng)中遇到的問(wèn)題。 JAVA連接HBase代碼如下: 首先通過(guò)POM將需要的JAR包導(dǎo)入。

    2024年02月03日
    瀏覽(23)
  • Python 操作 MySQL:使用 mysql-connector-python 操作 MySQL 數(shù)據(jù)庫(kù)

    Python 操作 MySQL:使用 mysql-connector-python 操作 MySQL 數(shù)據(jù)庫(kù)

    大家好,我是水滴~~ 當(dāng)涉及到使用 Python 操作 MySQL 數(shù)據(jù)庫(kù)時(shí), mysql-connector-python 庫(kù)是一個(gè)強(qiáng)大而常用的選擇。該庫(kù)提供了與 MySQL 數(shù)據(jù)庫(kù)的交互功能,使您能夠執(zhí)行各種數(shù)據(jù)庫(kù)操作,如連接數(shù)據(jù)庫(kù)、執(zhí)行查詢和插入數(shù)據(jù)等。在本文中,我們將介紹如何使用 mysql-connector-python 庫(kù)來(lái)

    2024年02月04日
    瀏覽(27)
  • 【100天精通python】Day30:使用python操作數(shù)據(jù)庫(kù)_數(shù)據(jù)庫(kù)基礎(chǔ)入門

    【100天精通python】Day30:使用python操作數(shù)據(jù)庫(kù)_數(shù)據(jù)庫(kù)基礎(chǔ)入門

    ?專欄導(dǎo)讀? 專欄訂閱地址: https://blog.csdn.net/qq_35831906/category_12375510.html 1.1 什么是數(shù)據(jù)庫(kù)? ????????數(shù)據(jù)庫(kù)是一個(gè)結(jié)構(gòu)化存儲(chǔ)和組織數(shù)據(jù)的集合,它可以被有效地訪問(wèn)、管理和更新。數(shù)據(jù)庫(kù)的目的是為了提供一種可靠的方式來(lái)存儲(chǔ)和管理大量的數(shù)據(jù),以便用戶和應(yīng)用程序

    2024年02月13日
    瀏覽(34)
  • python3使用pymsql操作mysql數(shù)據(jù)庫(kù)

    python3使用pymsql操作mysql數(shù)據(jù)庫(kù)

    操作系統(tǒng) :Windows 10_x64 python版本 :3.9.2 pymysql版本: 1.0.2 MySQL版本: 5.7.38 ? 之前寫過(guò)一篇關(guān)于python操作mysql數(shù)據(jù)庫(kù)的文章: https://www.cnblogs.com/MikeZhang/p/pythonOptMysql20170703.html 當(dāng)時(shí)是基于python 2.7 和 mysql 5.5來(lái)整理的,但目前python 2.7已經(jīng)不再維護(hù),主流的是python 3,今天基于pyt

    2024年02月05日
    瀏覽(29)
  • Python 操作 MySQL 數(shù)據(jù)庫(kù):使用 mysql-connector-python 庫(kù)

    在現(xiàn)代應(yīng)用程序中,與數(shù)據(jù)庫(kù)的交互是不可或缺的一部分。Python 提供了許多庫(kù)來(lái)連接和操作各種數(shù)據(jù)庫(kù),其中最常用的之一就是 mysql-connector-python 。本篇博客將介紹如何使用 Python 操作 MySQL 數(shù)據(jù)庫(kù),包括連接數(shù)據(jù)庫(kù)、創(chuàng)建表、插入數(shù)據(jù)、查詢數(shù)據(jù)以及更新和刪除數(shù)據(jù)等操作。

    2024年02月03日
    瀏覽(27)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包