【學習筆記】深入淺出詳解Pytorch中的View, reshape, unfold,flatten等方法。

文章目錄

  • 一、寫在前面
  • 二、Reshape
    • (一)用法
    • (二)代碼展示
  • 三、Unfold
    • (一)torch.unfold 的基本概念
    • (二)torch.unfold 的工作原理
    • (三) 示例代碼
    • (四)torch.unfold 的應用場景
    • (五)注意事項
    • (六)總結
  • 四、View
    • (一)用法
    • (二)注意事項
    • (三)其他方法
  • 五、Flatten
    • (一)torch.flatten 的基本概念
    • (二)torch.flatten 的工作原理
    • (三)示例代碼
  • 六、Permute
    • (一)torch.permute 的基本概念
    • (二)torch.permute 的工作原理
    • (三) 示例代碼
    • (四) torch.permute 的應用場景
  • 七、總結

一、寫在前面

最近在解析transformer源碼的時候突然看到了unfold?我在想unfold是什么意思?為什么不用reshape,他們的底層邏輯有什么區別呢?于是便相對比一下他們之間的區別,便有了本篇博客,希望對大家有幫助!

二、Reshape

(一)用法

1. torch.reshape(input, shape)
輸入是tensor和shape,其中原始shape和目標shape的元素數量要一致。

2. Tensor.reshape(shape) → Tensor
與上述用法一致,只不過這個是直接在tensor的基礎上進行reshape。

reshpe是按照順序進行重新排列組合的。
[16,2] 其實與 [4,2,2,2] 是一樣的,只要最后一維的數字是一樣,其實結果都是一樣的。

(二)代碼展示

三、Unfold

(一)torch.unfold 的基本概念

torch.unfold 的作用是將輸入張量的某個維度展開為多個滑動窗口。每個窗口包含一個局部區域,這些區域可以用于后續的計算。

  1. 語法:
torch.Tensor.unfold(dimension, size, step)
  1. 參數:
    • dimension:要展開的維度(整數)。
    • size:滑動窗口的大小(整數)。
    • step:滑動窗口的步長(整數)。
    • 返回值:返回一個新的張量,其中指定維度的每個元素被展開為多個滑動窗口。

(二)torch.unfold 的工作原理

假設我們有一個形狀為 (N, C, H, W) 的張量(例如圖像數據),我們希望在高度維度(H)上提取滑動窗口。

  • 輸入張量:(N, C, H, W)
  • 展開維度:dimension=2(即高度維度 H)
  • 窗口大小:size=k(例如 k=3)
  • 步長:step=s(例如 s=1)

torch.unfold 會將高度維度 H 展開為多個大小為 k 的滑動窗口,每個窗口之間間隔 s。

(三) 示例代碼

  • 示例 1:一維張量的展開
import torch
# 創建一個一維張量
x = torch.arange(10)
print("原始張量:", x)# 使用 unfold 展開
unfolded = x.unfold(dimension=0, size=3, step=1)
print("展開后的張量:\n", unfolded)
  • 輸出:
原始張量: tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
展開后的張量:tensor([[0, 1, 2],[1, 2, 3],[2, 3, 4],[3, 4, 5],[4, 5, 6],[5, 6, 7],[6, 7, 8],[7, 8, 9]])
  • 示例 2:二維張量的展開(圖像處理)
import torch
# 創建一個二維張量(模擬圖像)x = torch.arange(16).reshape(1, 1, 4, 4)  # 形狀為 (1, 1, 4, 4)print("原始張量:\n", x)# 使用 unfold 展開unfolded_1 = x.unfold(dimension=2, size=3, step=1)unfolded_2 = unfolded_1.unfold(dimension=3, size=3, step=1)print("展開后的張量形狀:", unfolded_1.shape)print("展開后的張量:\n", unfolded_1)print("展開后的張量形狀:", unfolded_2.shape)print("展開后的張量:\n", unfolded_2)
  • 輸出:
原始張量:tensor([[[[ 0,  1,  2,  3],[ 4,  5,  6,  7],[ 8,  9, 10, 11],[12, 13, 14, 15]]]])
展開后的張量形狀: torch.Size([1, 1, 2, 4, 3])
展開后的張量:tensor([[[[[ 0,  4,  8],[ 1,  5,  9],[ 2,  6, 10],[ 3,  7, 11]],[[ 4,  8, 12],[ 5,  9, 13],[ 6, 10, 14],[ 7, 11, 15]]]]])
展開后的張量形狀: torch.Size([1, 1, 2, 2, 3, 3])
展開后的張量:tensor([[[[[[ 0,  1,  2],[ 4,  5,  6],[ 8,  9, 10]],[[ 1,  2,  3],[ 5,  6,  7],[ 9, 10, 11]]],[[[ 4,  5,  6],[ 8,  9, 10],[12, 13, 14]],[[ 5,  6,  7],[ 9, 10, 11],[13, 14, 15]]]]]])

數組的運算主要看最后兩維,倒數第二維代表行,倒數第一維代表列。

(四)torch.unfold 的應用場景

  1. 卷積操作

在卷積神經網絡(CNN)中,卷積核通過滑動窗口的方式提取圖像的局部特征。torch.unfold 可以用于手動實現卷積操作。

  1. 圖像處理

在圖像處理中,torch.unfold 可以用于提取圖像的局部區域(例如提取圖像的滑動窗口)。

  1. 時間序列分析

在時間序列分析中,torch.unfold 可以用于提取時間序列的滑動窗口,用于特征提取或模型訓練。

(五)注意事項

  1. 維度選擇:需要明確指定要展開的維度(dimension)。
  2. 窗口大小和步長:窗口大小(size)和步長(step)的選擇會影響展開后的張量形狀。
  3. 內存消耗:torch.unfold 可能會生成較大的張量,尤其是在高維數據上使用時,需要注意內存消耗。

(六)總結

  1. torch.unfold 的作用:從張量的某個維度提取滑動窗口。
  2. 常用參數:dimension(展開維度)、size(窗口大小)、step(步長)。
  3. 應用場景:卷積操作、圖像處理、時間序列分析等。
  4. 注意事項:選擇合適的維度、窗口大小和步長,避免內存消耗過大。

四、View

torch.view 用于返回一個與原始張量共享相同數據存儲的新張量,但具有不同的形狀。換句話說,view 只是改變了張量的視圖(view),而不會復制數據。

(一)用法

  1. Tensor.view(*shape):
    • 參數:

    *shape:新的形狀(可以是整數或元組)。

    • 返回值:

    返回一個新的張量,具有指定的形狀,并與原始張量共享相同的數據存儲。

(二)注意事項

  1. view 返回的張量與原始張量共享相同的數據存儲。
  2. 如果原始張量的數據發生變化,view 返回的張量也會隨之變化。
  3. view 要求張量的內存必須是連續的(即張量在內存中是連續存儲的)。如果內存不連續,view 會拋出錯誤。

(三)其他方法

  1. view_as
  • 作用:將當前張量轉換為與另一個張量相同的形狀。
  • 語法:
torch.Tensor.view_as(other)
  • 參數:

other:目標張量,當前張量的形狀將被轉換為與 other 相同的形狀。

  • 返回值:

返回一個新的張量,具有與 other 相同的形狀,并與原始張量共享數據存儲。

  • 示例:
import torch
# 創建一個張量
x = torch.arange(12)
print("原始張量:", x)
# 創建目標張量
other = torch.empty(3, 4)
# 使用 view_as 改變形狀
y = x.view_as(other)
print("改變形狀后的張量:\n", y)
  • 輸出:
原始張量: tensor([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
改變形狀后的張量:tensor([[ 0,  1,  2,  3],[ 4,  5,  6,  7],[ 8,  9, 10, 11]])
  1. view_as_real
  • 作用:將復數張量轉換為實數張量。
  • 語法:
torch.Tensor.view_as_real()
  • 返回值:

返回一個新的實數張量,形狀為 (…, 2),其中最后一個維度包含復數的實部和虛部。

  • 示例:
import torch
# 創建一個復數張量
x = torch.tensor([1 + 2j, 3 + 4j])
print("原始張量:", x)
# 使用 view_as_real 轉換為實數張量
y = x.view_as_real()
print("轉換后的張量:\n", y)
  • 輸出:
原始張量: tensor([1.+2.j, 3.+4.j])
轉換后的張量:tensor([[1., 2.],[3., 4.]])
  1. view_as_complex
  • 作用:將實數張量轉換為復數張量。
  • 語法:
torch.Tensor.view_as_complex()
  • 返回值:

返回一個新的復數張量,形狀為 (…,),其中最后一個維度被解釋為復數的實部和虛部。

  • 示例:
import torch
# 創建一個實數張量
x = torch.tensor([[1., 2.], [3., 4.]])
print("原始張量:\n", x)
# 使用 view_as_complex 轉換為復數張量
y = x.view_as_complex()
print("轉換后的張量:", y)
  • 輸出:
原始張量:tensor([[1., 2.],[3., 4.]])
轉換后的張量: tensor([1.+2.j, 3.+4.j])
  1. view_as_strided
  • 作用:返回一個具有指定步長和內存布局的張量視圖。
  • 語法:
torch.Tensor.view_as_strided(size, stride)
  • 參數:

size:新的形狀(元組)。
stride:新的步長(元組)。

  • 返回值:

返回一個新的張量,具有指定的形狀和步長,并與原始張量共享數據存儲。

  • 示例:
import torch
# 創建一個張量
x = torch.arange(9).view(3, 3)
print("原始張量:\n", x)
# 使用 view_as_strided 改變形狀和步長
y = x.view_as_strided((2, 2), (1, 2))
print("改變形狀和步長后的張量:\n", y)
  • 輸出:
原始張量:tensor([[0, 1, 2],[3, 4, 5],[6, 7, 8]])
改變形狀和步長后的張量:tensor([[0, 2],[1, 3]])
  1. view_as_real 和 view_as_complex 的應用場景
  • 復數計算:

在涉及復數計算的任務中,view_as_real 和 view_as_complex 可以用于在復數和實數之間進行轉換。

  • 信號處理:

在信號處理中,復數張量常用于表示頻域信號,view_as_real 和 view_as_complex 可以用于頻域和時域之間的轉換。

  1. view_as_strided 的應用場景
  • 自定義內存布局:

在需要自定義內存布局的場景中,view_as_strided 可以用于創建具有特定步長和形狀的張量視圖。

  • 高效內存訪問:

在需要高效訪問內存的場景中,view_as_strided 可以用于優化內存訪問模式。

五、Flatten

(一)torch.flatten 的基本概念

torch.flatten 的作用是將輸入張量的指定維度展平為一維。它可以展平整個張量,也可以只展平部分維度。

  1. 語法:
torch.flatten(input, start_dim=0, end_dim=-1)
  1. 參數:

    • input:輸入張量。
    • start_dim:開始展平的維度(整數),默認為 0。
    • end_dim:結束展平的維度(整數),默認為 -1。
    • 返回值:返回一個新的張量,具有展平后的形狀。

(二)torch.flatten 的工作原理

  1. torch.flatten 會將指定范圍內的維度展平為一維。
  2. 如果 start_dim=0 且 end_dim=-1,則整個張量會被展平為一維。
  3. 如果只展平部分維度,則其他維度保持不變。

(三)示例代碼

  • 示例 1:展平整個張量
import torch
# 創建一個二維張量
x = torch.arange(12).view(3, 4)
print("原始張量:\n", x)
# 使用 flatten 展平整個張量
y = torch.flatten(x)
print("展平后的張量:", y)
  • 輸出:
原始張量:tensor([[ 0,  1,  2,  3],[ 4,  5,  6,  7],[ 8,  9, 10, 11]])
展平后的張量: tensor([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
  • 示例 2:展平部分維度
import torch
# 創建一個三維張量
x = torch.arange(24).view(2, 3, 4)
print("原始張量:\n", x)
# 使用 flatten 展平第二個維度到第三個維度
y = torch.flatten(x, start_dim=1, end_dim=2)
print("展平后的張量:\n", y)
  • 輸出:
原始張量:tensor([[[ 0,  1,  2,  3],[ 4,  5,  6,  7],[ 8,  9, 10, 11]],[[12, 13, 14, 15],[16, 17, 18, 19],[20, 21, 22, 23]]])
展平后的張量:tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11],[12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23]])
  • 示例 3:展平特定維度
import torch
# 創建一個四維張量
x = torch.arange(24).view(2, 2, 3, 2)
print("原始張量:\n", x)
# 使用 flatten 展平第三個維度
y = torch.flatten(x, start_dim=2, end_dim=2)
print("展平后的張量:\n", y)
  • 輸出:
原始張量:tensor([[[[ 0,  1],[ 2,  3],[ 4,  5]],[[ 6,  7],[ 8,  9],[10, 11]]],[[[12, 13],[14, 15],[16, 17]],[[18, 19],[20, 21],[22, 23]]]])
展平后的張量:tensor([[[ 0,  1,  2,  3,  4,  5],[ 6,  7,  8,  9, 10, 11]],[[12, 13, 14, 15, 16, 17],[18, 19, 20, 21, 22, 23]]])

六、Permute

(一)torch.permute 的基本概念

torch.permute 的作用是將輸入張量的維度按照指定的順序重新排列。它類似于 NumPy 中的 transpose,但更加靈活,可以同時對多個維度進行排列。

  1. 語法:
torch.Tensor.permute(*dims)
  1. 參數:
    • *dims:新的維度順序(元組或多個整數)。
    • 返回值:返回一個新的張量,具有重新排列后的維度順序,并與原始張量共享數據存儲。

(二)torch.permute 的工作原理

torch.permute 會將輸入張量的維度按照指定的順序重新排列。
新的維度順序必須與原始張量的維度數量相同,并且每個維度索引只能出現一次。

(三) 示例代碼

  1. 示例 1:二維張量的轉置
import torch
# 創建一個二維張量
x = torch.arange(12).view(3, 4)
print("原始張量:\n", x)# 使用 permute 轉置
y = x.permute(1, 0)  # 將維度 0 和 1 交換
print("轉置后的張量:\n", y)
  • 輸出:
原始張量:tensor([[ 0,  1,  2,  3],[ 4,  5,  6,  7],[ 8,  9, 10, 11]])
轉置后的張量:tensor([[ 0,  4,  8],[ 1,  5,  9],[ 2,  6, 10],[ 3,  7, 11]])
  1. 示例 2:三維張量的維度重排
import torch
# 創建一個三維張量
x = torch.arange(24).view(2, 3, 4)
print("原始張量:\n", x)# 使用 permute 重排維度
y = x.permute(2, 0, 1)  # 將維度 0, 1, 2 重排為 2, 0, 1
print("重排后的張量形狀:", y.shape)
print("重排后的張量:\n", y)
  • 輸出:
原始張量:tensor([[[ 0,  1,  2,  3],[ 4,  5,  6,  7],[ 8,  9, 10, 11]],[[12, 13, 14, 15],[16, 17, 18, 19],[20, 21, 22, 23]]])
重排后的張量形狀: torch.Size([4, 2, 3])
重排后的張量:tensor([[[ 0,  4,  8],[12, 16, 20]],[[ 1,  5,  9],[13, 17, 21]],[[ 2,  6, 10],[14, 18, 22]],[[ 3,  7, 11],[15, 19, 23]]])
  1. 示例 3:四維張量的維度重排
import torch
# 創建一個四維張量
x = torch.arange(24).view(2, 2, 3, 2)
print("原始張量:\n", x)# 使用 permute 重排維度
y = x.permute(3, 1, 2, 0)  # 將維度 0, 1, 2, 3 重排為 3, 1, 2, 0
print("重排后的張量形狀:", y.shape)
print("重排后的張量:\n", y)
  • 輸出:
原始張量:tensor([[[[ 0,  1],[ 2,  3],[ 4,  5]],[[ 6,  7],[ 8,  9],[10, 11]]],[[[12, 13],[14, 15],[16, 17]],[[18, 19],[20, 21],[22, 23]]]])
重排后的張量形狀: torch.Size([2, 2, 3, 2])
重排后的張量:tensor([[[[ 0, 12],[ 2, 14],[ 4, 16]],[[ 6, 18],[ 8, 20],[10, 22]]],[[[ 1, 13],[ 3, 15],[ 5, 17]],[[ 7, 19],[ 9, 21],[11, 23]]]])

(四) torch.permute 的應用場景

  1. 圖像處理

在圖像處理中,torch.permute 可以用于調整圖像的通道順序。例如,將 (C, H, W) 的圖像張量轉換為 (H, W, C)。

  1. 深度學習模型輸入

在深度學習中,模型的輸入張量通常需要特定的維度順序。torch.permute 可以用于調整輸入張量的維度順序。

  1. 數據預處理

在數據預處理中,torch.permute 可以用于調整數據的維度順序,以便進行后續的計算或操作。

如果每一維度都有特定的含義,此時想改變維度的時候用permute。

七、總結

  1. reshape 與 view 幾乎一致, 甚至可以說reshape可以代替view;
  2. reshape 與 permute 的區別在于,reshape是按照順序重新進行排列組合,permute是按照維度進行重新排列組合,如果各個維度都有特定的意義,那么permute會更合適。
  3. unfold是按照某一維度滑動選取數據,新增加一維,新增加的維度的大小為滑動窗口的大小,原始維度會根據滑動窗口和step的大小而變化。
  4. flatten也是按照順序進行展開,且展開的是某個范圍的維度,不是特定的維度。
  5. 不管是幾維數組,主要看最后兩維,倒數第二維代表行,倒數第一維代表列。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/63571.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/63571.shtml
英文地址,請注明出處:http://en.pswp.cn/web/63571.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深入理解 MySQL 索引

引言 在數據庫管理中,索引(Index)是提高查詢性能的關鍵技術之一。MySQL 是最流行的關系型數據庫管理系統之一,廣泛應用于各種規模的應用程序中。本文將深入探討 MySQL 中的索引概念、類型、工作原理以及最佳實踐,幫助…

利用notepad++刪除特定關鍵字所在的行

1、按組合鍵Ctrl H,查找模式選擇 ‘正則表達式’,不選 ‘.匹配新行’ 2、查找目標輸入 : ^.*關鍵字.*\r\n (不保留空行) ^.*關鍵字.*$ (保留空行)3、替換為:(空) 配置界面參考下圖: ??…

docker安裝和換源

安裝: https://www.runoob.com/docker/ubuntu-docker-install.html sudo apt-get remove docker docker-engine docker.io containerd runcsudo apt-get install \apt-transport-https \ca-certificates \curl \gnupg-agent \software-properties-commoncurl -fsS…

CSSmodule的作用是什么

CSS Modules的作用主要體現在以下幾個方面: 1. 解決全局樣式污染問題 在傳統的CSS管理方式中,樣式定義通常是全局的,這很容易導致全局樣式污染。當多個組件或頁面共享同一個樣式時,可能會出現樣式沖突和覆蓋的情況,從…

創建第一個QML項目

文章目錄 使用 Qt Creator 創建 Qt Quick 項目詳解為什么選擇 Qt Creator?1. 打開 Qt Creator2. 選擇項目模板3. 設置項目名稱與路徑4. 定義項目細節5. 配置構建套件6. 檢查項目配置7. 編譯并運行項目后續操作修改界面添加功能 總結 使用 Qt Creator 創建 Qt Quick …

【k8s集群應用】K8S二進制安裝大致步驟(簡略版)

文章目錄 K8S二進制安裝部署etcd測試etcd集群(可選)恢復etcd數據庫 部署master組件部署node組件K8S kubeadm安裝關鍵命令更新kubeadm安裝的K8S證書有效期方法一方法二查看證書有效期 K8S二進制安裝 部署etcd 使用cfssl工具簽發證書和私鑰下載解壓etcd軟…

瑞吉外賣項目學習筆記(二)Swagger、logback、表單校驗和參數打印功能的實現

瑞吉外賣項目學習筆記(一)準備工作、員工登錄功能實現 文章目錄 3 項目組件優化3.1 實現Swagger文檔輸出3.2 實現logback日志打印3.3 實現表單校驗功能3.4 實現請求參數和響應參數的打印 3 項目組件優化 3.1 實現Swagger文檔輸出 1)在application.yml中增加knife4…

leetcode刷題-回溯算法04

代碼隨想錄回溯算法part01| 491.遞增子序列、46.全排列、47.全排列II 491.遞增子序列46.全排列47.全排列II 491.遞增子序列 leetcode題目鏈接 代碼隨想錄文檔講解 思路: 與上一題不同,不能用used列表,因為這個題不能排序, 在每一…

基于字節大模型的論文翻譯(含免費源碼)

基于字節大模型的論文翻譯 源代碼: 👏 star ? https://github.com/boots-coder/LLM-application 展示 項目簡介 本項目是一個基于大語言模型(Large Language Model, LLM)的論文閱讀與翻譯輔助工具。它通過用戶界面&#xff08…

mysql的事務控制和數據庫的備份和恢復

事務控制語句 行鎖和死鎖 行鎖 兩個客戶端同時對同一索引行進行操作 客戶端1正常運行 客戶端2想修改,被鎖行 除非將事務提交才能繼續運行 死鎖 客戶端1刪除第5行 客戶端2設置第1行為排他鎖 客戶端1刪除行1被鎖 客戶端2更新行5被鎖 如何避免死鎖 mysql的備份和還…

Tengine:Nginx二次開發-高性能進化

前言:在當今的互聯網時代,Web 服務器的性能和穩定性對于網站的成功至關重要。Nginx 以其高性能和可擴展性而聞名,但有時候,我們需要更多的特性來滿足特定的業務需求。Tengine,作為一個由淘寶網發起的 Nginx 二次開發版…

RK3588, FFmpeg 拉流 RTSP, mpp 硬解碼轉RGB

RK3588 ,基于FFmpeg, 拉取RTSP,使用 mpp 實現硬解碼. ?? 傳送 ?? Ubuntu x64 架構, 交叉編譯aarch64 FFmpeg mppRK3588, FFmpeg 拉流 RTSP, mpp 硬解碼轉RGBRk3588 FFmpeg 拉流 RTSP, 硬解碼轉RGBRK3588 , mpp硬編碼yuv, 保存MP4視頻文件.

Windows 下 Anaconda的安裝與配置 GPU 版

給之前的電腦安一下深度學習環境 判斷是否有NVIDIA GPU Ctrl Shift Esc 打開任務管理器 帶此字眼表示有 NVIDIA GPU 安裝Anaconda anaconda 打開郵箱會看到下載鏈接 這里建議修改為其他盤,要不然下載的包和創建的環境都在C盤,占用空間 三個都打鉤 取…

【openssl】 version `OPENSSL_3.0.3‘ not found 問題

【openssl】 version OPENSSL_3.0.3 not found 問題 使用openssl時候報錯: openssl lib/libcrypto.so.3: version OPENSSL_3.0.3 not found查閱CSDN發現有博主說把別的地方的libcrypto.so.3 復制過去就好了。 嘗試無效 警告!這個操作不對: 不…

flask flask-socketio創建一個網頁聊天應用

應用所需環境: python 3.11.11 其他 只需要通過這個命令即可 pip install flask3.1.0 Flask-SocketIO5.4.1 -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple 最好是用conda創建一個新的虛擬環境來驗證 完整的pip list如下 Package Version ----…

聯邦學習防止數據泄露

文章目錄 聯邦學習防止數據泄露的原理聯邦學習的優勢聯邦學習與集中式學習的成本分析聯邦學習的實際應用案例個人設想參考文獻 聯邦學習 (Federated Learning) 是一種分布式機器學習技術,旨在解決數據隱私保護問題。它允許在分散的數據源上進行模型訓練,…

STM32 水質水位檢測項目(硬件架構)及(軟件架構)

硬件選型 水位測量模塊 TDS采集模塊 外置ADC模塊(ADS1115) 水位測量模塊使用方法 水位測量原理 壓力傳感器:水越深壓力越大 P ρgh Fps Fρgh*s P大氣壓 水位測量傳感器本質上是一個壓力測量傳感器。壓力的值和傳感器產生的電壓值是線…

C# 6.0 連接elasticsearch數據庫

在 C# 6.0 中連接 Elasticsearch 數據庫,您可以使用官方的 Elasticsearch 客戶端庫 NEST。NEST 是一個高性能的 .NET 客戶端,用于與 Elasticsearch 進行交互。以下是一個詳細的步驟指南,幫助您在 C# 6.0 項目中連接和操作 Elasticsearch。 1. 安裝 NEST 包 首先,您需要在您…

服務器數據恢復—RAIDZ離線硬盤數超過熱備盤數導致陣列崩潰的數據恢復案例

服務器存儲數據恢復環境: ZFS Storage 7320存儲陣列中有32塊硬盤。32塊硬盤分為4組,每組8塊硬盤,共組建了3組RAIDZ,每組raid都配置了熱備盤。 服務器存儲故障: 服務器存儲運行過程中突然崩潰,排除人為誤操…

Java轉C++之編程范式

1. 過程式編程(Procedural Programming) 在 C 中的表現 過程式編程是通過一系列的函數調用來實現程序的功能。函數是核心構建單元,數據和操作通過函數進行交互。 C 中:可以使用普通的函數和全局變量來進行過程式編程。Java 中&…