Linux內核ext4 extent:解決大文件存儲難題的關鍵

在Linux 操作系統的龐大生態中,文件系統猶如一座城市的基礎設施,支撐著數據的有序存儲與高效訪問。而 ext4 文件系統,作為 Linux 文件系統家族中的重要一員,自誕生起便憑借諸多先進特性備受矚目。其中,extent 機制堪稱 ext4 的一大核心亮點,它從根本上改變了文件數據的組織與尋址方式。在深入探究 ext4 extent 之前,讓我們先回溯一下歷史。早期的 ext2、ext3 文件系統采用直接 + 間接尋址模式來處理文件邏輯地址到物理塊地址的映射,這種方式在面對大文件時,暴露出諸如物理塊浪費、磁盤性能低下、效率不高以及易碎片化等諸多弊端。

extent 機制的引入,正是為了革除這些弊病。它以一種更為緊湊、高效的方式,描述大文件邏輯地址與物理地址的映射關系,大幅節省磁盤空間,顯著提升尋址性能,并有效緩解碎片化問題。接下來,本文將深入 Linux 內核源碼的世界,從數據結構定義、操作函數實現等底層視角,結合實例演示,全方位、深層次地剖析 ext4 extent,力圖揭開其神秘面紗,讓大家透徹理解其工作原理與精妙之處 。

一、Linux 文件系統小科普

在 Linux 系統的龐大體系中,文件系統就像是一個井然有序的圖書館,負責高效管理和存儲數據。它不僅提供了文件和目錄的組織管理功能,還負責文件讀寫、權限管理、存儲設備的格式化等操作,其好壞直接影響到系統的性能、可靠性和安全性 。

圖片

ext4 文件系統,作為 Linux 系統中廣泛應用的文件系統,憑借其卓越的性能、強大的穩定性以及出色的兼容性,成為眾多用戶的信賴之選,也是當下 Linux 系統的默認文件系統。在 ext4 眾多的特性中,extent 堪稱其核心與靈魂所在,它的出現,徹底革新了文件數據的存儲與管理方式,為提升文件系統的性能開辟了全新的路徑。接下來,就讓我們深入到 Linux 內核源碼的世界,詳細解讀 ext4 extent。

二、ext4 extent是什么?

2.1傳統文件系統的痛點

在 extent 出現之前,傳統文件系統采用的是直接映射或間接映射方式,將文件邏輯塊號映射到物理塊號。在這種映射方式下,每個文件的數據塊地址都需要在映射表中記錄,隨著文件規模不斷增大,映射表會急劇膨脹,占用大量磁盤空間和內存資源。例如,一個 1GB 的文件,若以 4KB 為一個數據塊,就需要 262144 個塊地址記錄在映射表中,這對系統資源是極大的消耗。

同時,復雜的映射關系也使得文件讀寫操作時,需要頻繁訪問映射表來獲取物理塊地址,大大增加了系統開銷。以讀取一個大文件為例,系統需要多次查詢映射表,每次查詢都伴隨著磁盤 I/O 操作,這不僅增加了尋道時間,還延長了數據傳輸時間,導致文件讀寫速度大幅下降,嚴重影響系統性能。

2.2 extent閃亮登場

extent 的核心思想是將文件中的數據劃分為若干個連續的物理塊,這些連續的物理塊被視為一個整體,即 extent。通過這種方式,文件的數據不再是零散地分布在磁盤的各個角落,而是以連續的塊組形式存儲,大大提高了數據的存儲密度和連續性。比如,一個視頻文件在存儲時,其數據可以被劃分為多個 extent,每個 extent 包含若干連續的物理塊,這樣在讀取視頻文件時,就可以一次性讀取一個 extent 的數據,減少了磁盤尋道次數,提高了讀取效率。

這種連續性存儲方式帶來了諸多顯著的優勢。首先,它減少了文件數據的碎片化程度,使得文件在磁盤上的存儲更加緊湊和有序。這不僅有助于提高磁盤空間的利用率,還能減少文件讀寫時的尋道時間和旋轉延遲,從而顯著提升文件的讀寫性能。其次,extent 的使用簡化了文件的映射關系,使得文件的邏輯塊號與物理塊號之間的映射更加直觀和高效。通過 extent,文件系統可以直接定位到文件數據所在的物理塊,無需像傳統方式那樣進行復雜的映射表查詢,大大提高了文件的訪問速度和效率。

2.3實際應用大放送

在實際應用中,extent 的優勢得到了充分的體現。在處理大型數據庫文件時,extent 能夠確保數據庫文件的數據連續存儲,使得數據庫的讀寫操作更加高效和穩定。例如,在一個企業級數據庫系統中,經常需要對大規模數據進行查詢和更新操作,使用 extent 存儲數據可以大大提高數據庫的響應速度,滿足企業對數據處理的高要求。

在進行大規模文件傳輸時,extent 的連續性存儲方式可以減少文件傳輸過程中的中斷和錯誤,提高文件傳輸的成功率和速度。這對于需要頻繁進行文件傳輸的場景,如數據備份、文件共享等,具有重要的實用價值。比如,在進行數據備份時,使用 extent 存儲數據可以加快備份速度,減少備份時間,提高數據安全性。

三、ext4 extent誕生的故事

3.1 ext2、ext3 的 “老黃歷”

在計算機發展的早期,數據量相對較小,對文件系統的性能要求也不像現在這么高。ext2 文件系統應運而生,它采用直接 + 間接尋址的方式,在 inode 結構體中的 i_block 數組里,前 12 個元素用于直接尋址,對于小文件來說,這種方式簡單高效,系統能直接通過這些元素找到對應的物理塊,快速訪問文件數據。例如,一個大小為幾十 KB 的文本文件,其數據塊地址可以直接存儲在這 12 個元素中,讀取時無需復雜的尋址過程,大大提高了小文件的讀寫速度。

然而,隨著數據量的不斷增長,大文件的出現越來越頻繁,ext2 的局限性逐漸暴露出來。當文件較大時,僅靠直接尋址無法滿足需求,需要借助間接尋址。i_block 數組的第 13 個元素用于一級間接尋址,指向一個存儲數據塊地址的塊;第 14 個元素用于二級間接尋址,通過多層索引來找到數據塊地址;第 15 個元素用于三級間接尋址 。

這種復雜的尋址方式,在處理大文件時效率極其低下。以一個 1GB 的大文件為例,假設每個數據塊大小為 4KB,那么這個文件就需要 262144 個數據塊。在 ext2 文件系統中,為了記錄這些數據塊的地址,需要不斷地進行間接尋址,這不僅浪費了大量的磁盤空間來存儲索引信息,還導致文件讀寫時需要多次訪問磁盤,增加了尋道時間和數據傳輸時間,大大降低了文件系統的性能。

ext3 在 2001 年出現,它在 ext2 的基礎上增加了日志功能,大大提高了文件系統的可靠性和穩定性。在系統崩潰或掉電時,ext3 可以利用日志快速恢復文件系統的一致性,減少數據丟失的風險。然而,ext3 并沒有從根本上解決 ext2 在處理大文件時的性能問題,仍然采用直接 + 間接尋址的方式,隨著數據量的持續增長,ext3 在大文件處理上的局限性也越發明顯,無法滿足日益增長的存儲和性能需求。

3.2 extent 來救場

為了解決 ext2 和 ext3 在大文件處理上的困境,extent 應運而生。extent 的出現,徹底改變了文件數據的存儲和管理方式。它將文件中的數據劃分為若干個連續的物理塊,這些連續的物理塊被視為一個整體,即 extent。通過這種方式,文件的數據不再是零散地分布在磁盤的各個角落,而是以連續的塊組形式存儲,大大提高了數據的存儲密度和連續性。

在處理大文件時,extent 機制將大文件的數據存儲在較少的 extent 中,減少了磁盤尋道時間和數據傳輸的開銷,從而顯著提高了大文件的讀寫速度。例如,對于一個大型視頻文件,extent 可以將其數據存儲在幾個連續的 extent 中,讀取時只需一次性讀取這些 extent 的數據,而不需要像傳統方式那樣頻繁地尋道和讀取零散的數據塊,大大提高了視頻播放的流暢性和加載速度。

extent 還能有效減少文件碎片的產生,提高磁盤空間的利用率。在傳統的文件系統中,由于文件數據的零散存儲,容易產生大量的文件碎片,導致磁盤空間浪費和文件讀寫性能下降。而 extent 優先分配連續的磁盤空間,使得文件在磁盤上的存儲更加緊湊和有序,減少了碎片的產生,提高了磁盤空間的利用率。

四、ext4 extent 核心數據結構

深入探究 ext4 extent,就如同打開了一扇通往文件系統底層世界的大門,其核心數據結構精妙而復雜,支撐著文件系統的高效運行。這些數據結構不僅是理解 ext4 extent 工作原理的關鍵,更是掌握文件系統性能優化的基礎。接下來,讓我們一同揭開 ext4 extent 核心數據結構的神秘面紗,領略其設計的精妙之處。

4.1 inode里的小秘密

inode,作為文件系統中的關鍵概念,在 ext4 extent 中扮演著舉足輕重的角色。它是文件元數據的載體,存儲著文件的各種屬性信息,如文件大小、權限、所有者、創建時間、修改時間等 。這些屬性信息對于文件的管理和訪問至關重要,是文件系統進行各種操作的依據。

在 inode 結構體中,有一個重要的數組 i_block,它在文件尋址過程中起著關鍵作用。在傳統的 ext2 和 ext3 文件系統中,i_block 數組的前 12 個元素用于直接尋址,直接存儲文件數據塊的物理地址。對于小文件而言,這種直接尋址方式簡單高效,系統能迅速定位到文件數據所在的物理塊,實現快速的數據訪問。然而,當文件較大時,僅靠這 12 個直接尋址元素無法滿足需求,就需要借助間接尋址。

i_block 數組的第 13 個元素指向一個塊,該塊中存儲的是數據塊的地址,通過這種一級間接尋址,系統可以訪問更多的數據塊;第 14 個元素用于二級間接尋址,通過多層索引來找到數據塊地址;第 15 個元素則用于三級間接尋址 。這種復雜的尋址方式在處理大文件時,效率較低,且會占用大量的磁盤空間來存儲索引信息。

在 ext4 文件系統中,引入 extent 機制后,inode 的結構和功能發生了一些變化。inode 不再僅僅通過 i_block 數組來進行文件尋址,而是結合 extent 來更高效地管理文件數據的存儲位置。extent 的出現,使得 inode 能夠以更緊湊、更高效的方式記錄文件數據的物理位置,減少了尋址的復雜度和磁盤空間的浪費 。

4.2 extent 結構體剖析

extent 結構體是 ext4 extent 機制的核心組成部分,它精準地描述了文件邏輯塊與物理塊之間的映射關系。通過這個結構體,文件系統能夠清晰地知曉文件數據在磁盤上的存儲位置,實現高效的數據訪問和管理。

extent 結構體包含了多個關鍵信息,其中文件邏輯塊號(ee_block)明確標識了 extent 所對應的文件邏輯塊的起始位置,它是文件數據在邏輯層面的索引。起始磁盤塊號(由 ee_start_hi 和 ee_start_lo 共同確定)則指明了文件數據在磁盤上的實際起始物理位置,這是數據存儲的物理起點。塊數量(ee_len)表示該 extent 所包含的連續物理塊的數量,它決定了 extent 的大小和數據存儲的范圍。

這些信息相互配合,構成了 extent 結構體的核心功能。通過文件邏輯塊號,文件系統可以快速定位到需要訪問的文件邏輯塊;再結合起始磁盤塊號和塊數量,就能準確地找到對應的物理塊,實現文件數據的高效讀寫。這種映射關系的建立,使得文件系統能夠更有效地管理文件數據的存儲,提高了數據訪問的效率和可靠性 。

4.3 extent_tree 的魔法

對于大文件來說,單一的 extent 可能無法容納其全部數據,此時 ext4 采用 extent_tree 來管理多個 extent。extent_tree 本質上是一種基于 B + 樹的數據結構,這種結構在文件系統中發揮著重要的作用,極大地提升了文件系統的性能 。

在 extent_tree 中,B + 樹的葉子節點存儲著實際的 extent 信息,每個 extent 結構體都包含了文件邏輯塊號到物理塊號的映射關系。非葉子節點則作為索引節點,用于快速定位葉子節點。當文件系統需要查找某個文件邏輯塊對應的物理塊時,首先從根節點開始,通過比較邏輯塊號在非葉子節點中進行索引查找,逐步向下遍歷,最終找到對應的葉子節點,從而獲取到準確的 extent 信息 。

這種基于B+樹的間接尋址方式,具有諸多優勢。B+樹的結構特點使得數據查詢更加高效,它能夠快速定位到目標extent,減少了磁盤I/O操作的次數。與傳統的直接 + 間接尋址方式相比,extent_tree大大減少了元數據的存儲量,降低了磁盤空間的占用。B+樹的平衡性和有序性也保證了文件系統在處理大文件時的穩定性和可靠性 。

五、ext4 extent運行機制

5.1文件創建時的操作

當用戶在 Linux 系統中創建一個新文件時,ext4 文件系統會迅速響應,為文件分配連續的物理塊,構建文件邏輯塊號與物理塊號的映射關系,這一過程涉及多個關鍵步驟。

系統首先會在文件系統中查找一個空閑的 inode,inode 是文件元數據的載體,包含了文件的各種屬性信息,如文件大小、權限、所有者、創建時間、修改時間等 。一旦找到合適的空閑 inode,系統便會為其初始化相關信息,將文件的基本屬性記錄其中。

接著,ext4 文件系統會根據文件的大小和磁盤空間的使用情況,為文件分配連續的物理塊。在分配物理塊時,ext4 會優先嘗試在磁盤上找到一段連續的空閑空間,將這些連續的物理塊劃分為一個 extent。例如,當創建一個大小為 10MB 的文件時,如果磁盤上存在一段連續的 10MB 空閑空間,ext4 會將這段空間分配給文件,形成一個 extent。這樣做的好處是,文件的數據可以連續存儲,大大提高了文件的讀寫性能。

在完成物理塊的分配后,ext4 會構建文件邏輯塊號與物理塊號的映射關系。通過 extent 結構體,文件系統能夠清晰地記錄文件邏輯塊號與物理塊號之間的對應關系。每個 extent 結構體包含文件邏輯塊號、起始磁盤塊號和塊數量等關鍵信息。文件邏輯塊號(ee_block)明確標識了 extent 所對應的文件邏輯塊的起始位置;起始磁盤塊號(由 ee_start_hi 和 ee_start_lo 共同確定)則指明了文件數據在磁盤上的實際起始物理位置;塊數量(ee_len)表示該 extent 所包含的連續物理塊的數量。通過這些信息,文件系統可以快速定位到文件數據所在的物理塊,實現高效的數據訪問。

5.2文件讀取的過程

在 Linux 系統中,當用戶發起文件讀取請求時,ext4 extent 會迅速響應,根據文件邏輯塊號與物理塊號的映射關系,快速定位到文件數據所在的物理塊,并將數據讀取到內存中,這一過程涉及多個關鍵步驟。

系統會根據用戶提供的文件路徑,找到對應的 inode。inode 中包含了文件的各種元數據信息,如文件大小、權限、所有者、創建時間、修改時間等 ,以及指向文件數據的指針。通過 inode,系統可以獲取到文件的 extent tree 的指針,extent tree 是一種基于 B + 樹的數據結構,用于組織和管理文件的 extent。

接著,系統會利用 extent tree 來查找文件數據所在的 extent。在 extent tree 中,B + 樹的葉子節點存儲著實際的 extent 信息,每個 extent 結構體都包含了文件邏輯塊號到物理塊號的映射關系。非葉子節點則作為索引節點,用于快速定位葉子節點。當系統需要查找某個文件邏輯塊對應的物理塊時,首先從根節點開始,通過比較邏輯塊號在非葉子節點中進行索引查找,逐步向下遍歷,最終找到對應的葉子節點,從而獲取到準確的 extent 信息 。

在找到對應的 extent 后,系統會根據 extent 結構體中記錄的物理塊號,從磁盤上讀取相應的數據塊,并將數據讀取到內存中。由于 extent 將文件數據存儲在連續的物理塊中,減少了磁盤尋道時間和數據傳輸的開銷,從而大大提高了文件的讀取速度。例如,當讀取一個視頻文件時,extent 機制可以使得視頻數據能夠連續地從磁盤讀取到內存中,保證了視頻播放的流暢性,減少了卡頓現象的發生。

5.3文件寫入的步驟

在 Linux 系統中,當用戶執行文件寫入操作時,ext4 extent 會有條不紊地處理數據寫入、空間分配及映射關系更新等流程,確保文件數據的準確存儲和文件系統的高效運行。

當用戶向文件寫入數據時,系統首先會檢查文件當前的大小和已分配的磁盤空間。如果文件需要擴展,即寫入的數據量超過了當前已分配的磁盤空間,ext4 會為文件分配合適的 extent。在分配 extent 時,ext4 會優先嘗試在磁盤上找到一段連續的空閑空間,將這些連續的物理塊劃分為一個新的 extent。例如,當用戶向一個已存在的文件中追加 10MB 的數據時,如果磁盤上存在一段連續的 10MB 空閑空間,ext4 會將這段空間分配給文件,形成一個新的 extent。這樣做的好處是,文件的數據可以連續存儲,大大提高了文件的讀寫性能。

如果沒有足夠大的連續空間,ext4才會考慮分配不連續的空間,并將其作為多個extent來管理。在分配不連續的空間時,ext4會為每個不連續的空間創建一個新的 extent,并在extent tree 中記錄這些 extent 的信息 。

在完成 extent 的分配后,系統會將用戶寫入的數據寫入到新分配的 extent 中。同時,ext4會更新文件的inode信息,包括文件的大小、修改時間等,以反映文件的最新狀態。ext4 還會更新 extent tree 中相關的映射關系,確保文件邏輯塊號與物理塊號的映射關系始終準確無誤。例如,當用戶向文件中寫入新的數據時,ext4 會在 extent tree 中更新對應的 extent 結構體,記錄新的數據存儲位置和塊數量等信息。

5.4文件刪除的處理

在 Linux 系統中,當用戶執行文件刪除操作時,ext4 extent 會迅速響應,釋放文件占用的物理塊,更新映射關系及相關數據結構,以確保磁盤空間的有效回收和文件系統的一致性。

當用戶刪除一個文件時,系統首先會找到該文件對應的 inode。inode 中包含了文件的各種元數據信息,如文件大小、權限、所有者、創建時間、修改時間等 ,以及指向文件數據的指針。通過 inode,系統可以獲取到文件的 extent tree 的指針,extent tree 是一種基于 B + 樹的數據結構,用于組織和管理文件的 extent。

接著,系統會遍歷 extent tree,找到文件占用的所有 extent,并將這些 extent 標記為空閑。在標記 extent 為空閑后,ext4 會將這些 extent 所占用的物理塊釋放回磁盤空間,以便后續文件的分配使用。例如,當刪除一個包含多個 extent 的大文件時,ext4 會逐一將每個 extent 所占用的物理塊標記為空閑,釋放這些物理塊,使得磁盤空間得到有效回收。

系統會刪除文件的 inode 和 extent tree,更新文件系統的元數據信息,以反映文件的刪除操作。這一步驟確保了文件系統的一致性,避免了因文件刪除而導致的元數據不一致問題。在刪除 inode 和 extent tree 后,文件在文件系統中的所有痕跡被徹底清除,完成了文件的刪除操作。

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

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

相關文章

reactnative頁面適配UI設計尺寸px轉dp的完美解決方案px2dp精要篇

你的 px2dp 函數基本思路是正確的,但可以進一步優化以確保更精確的適配。以下是改進后的完美精確方案: 完美精確的適配方案 import { Dimensions, PixelRatio, Platform, ScaledSize } from react-native;// 獲取屏幕尺寸(考慮橫豎屏&#…

【世紀龍科技】汽車鈑金虛擬仿真教學實訓軟件

在汽車后市場人才緊缺的當下,職業院校汽車鈑金教學卻長期面臨“三難困境”:實訓設備昂貴且損耗快、學生實操機會稀缺、教學評價依賴主觀經驗。江蘇世紀龍科技公司以十余年汽車教育數字化積淀為基石,推出《汽車鈑金教學軟件》,通過…

Fiddler中文版抓包工具在后端API調試與Mock中的巧用

在現代開發中,前后端往往分屬不同小組甚至不同公司,接口聯調變得至關重要。尤其是在多團隊合作、后端接口尚未完成或頻繁變動的項目中,前端開發進度容易被阻礙。此時,通過靈活運用 Fiddler抓包工具,前端可以在后端接口…

基于 Flask框架開發的輕量級招聘網站

簡單的招聘網站示例 這是一個基于 Flask 框架開發的輕量級招聘網站示例,采用 Jinja2 模板引擎和 Bootstrap 前端框架,模仿 拉勾網 風格,實現了招聘平臺的核心功能。系統支持 個人用戶 和 企業用戶 兩種角色,個人用戶可以瀏覽職位、…

2025 年使用大模型進行軟件工程:現實檢驗

每周跟蹤AI熱點新聞動向和震撼發展 想要探索生成式人工智能的前沿進展嗎?訂閱我們的簡報,深入解析最新的技術突破、實際應用案例和未來的趨勢。與全球數同行一同,從行業內部的深度分析和實用指南中受益。不要錯過這個機會,成為AI領…

如何使用單例模式保證全局唯一實例(復雜版本)

/// <summary> /// 登錄管理類&#xff08;單例模式&#xff09;&#xff0c;負責用戶登錄、注銷及用戶信息管理 /// </summary> public class LoginMananger {// 用于線程同步的鎖對象static object _lockObj new object();// 單例實例&#xff08;延遲初始化&am…

瑞斯拜考研詞匯課筆記

學習視頻鏈接&#xff1a;瑞斯拜考研詞匯系統課-外刊50篇- 第一講_嗶哩嗶哩_bilibili Text 1 1.氣候危機讓普通人經歷了額外六周的高溫天氣。 The climate crisis caused the average person to experience six extra weeks of hot days. 2.碳排放是全球變暖的重要原因之一。 C…

SqlServer安裝后JDBC連接失敗——TCP/IP

朋友公司接了個項目&#xff0c;甲方BaBa用的數據庫是SqlServer 2022的Express版本&#xff0c;朋友讓我幫忙驗證下環境有沒有什么問題&#xff0c;軟件開發用的框架還是比較老的&#xff0c;spring的xml方式配置&#xff0c;用的c3p0的數據庫連接池&#xff0c;啟動項目連接池…

如何解決pip安裝報錯ModuleNotFoundError: No module named ‘datetime’問題

【Python系列Bug修復PyCharm控制臺pip install報錯】如何解決pip安裝報錯ModuleNotFoundError: No module named ‘datetime’問題 摘要 在日常Python開發中&#xff0c;我們常常需要通過pip install來安裝第三方包&#xff0c;但有時會在PyCharm的控制臺里遇到奇怪的ModuleN…

Windows 10 2016 長期服務版

系統介紹 Windows 10 2016 長期服務版。專為需要高度穩定性和最小功能變更的環境設計。它不僅適合專業領域&#xff0c;也是辦公環境的理想選擇。 系統特點 一、極致的穩定性 精簡的系統組件&#xff1a;移除許多現代應用&#xff0c;只保留基礎功能。 無強制功能更新&…

基于springboot的文件上傳系統:重新定義大文件傳輸的可靠性邊界

一、文件分塊上傳解析1、為什么傳統文件上傳已經無法滿足現代需求&#xff1f;在云原生時代&#xff0c;文件上傳不再是簡單的"選擇文件-點擊上傳"的過程。隨著視頻、設計圖、數據集等大文件的普及&#xff0c;傳統的單文件上傳方式面臨著諸多挑戰&#xff1a;網絡不…

系統學習Python——并發模型和異步編程:進程、線程和GIL

分類目錄&#xff1a;《系統學習Python》總目錄 在文章《并發模型和異步編程&#xff1a;基礎知識》我們簡單介紹了Python中的進程、線程和協程。本文就著重介紹Python中的進程、線程和GIL的關系。 Python解釋器的每個實例都是一個進程。使用multiprocessing或concurrent.futu…

【playwright篇】教程(十七)[html元素知識]

1 html中&#xff0c;button元素中的aria-describedby"tooltip-r1k"屬性&#xff0c;主要用來做什么&#xff1f;在 HTML 中&#xff0c;button 元素中的 aria-describedby"tooltip-r1k" 屬性主要用于提升網頁的可訪問性&#xff08;Accessibility&#xf…

Python: 正則表達式

正則表達式是處理文本數據的強大工具&#xff0c;Python通過re模塊提供了完整的正則表達式功能。本文將詳細介紹Python正則表達式的使用方法&#xff0c;包括基礎語法、高級技巧和re模塊API的詳細解析。一、正則表達式基礎1.1 什么是正則表達式正則表達式(Regular Expression)是…

pytest合并allure報告解決方案

背景 在執行自動化測試的過程中&#xff0c;為了實現自動化的高通過率&#xff0c;可能會反復的重試&#xff0c;直至大多數甚至全部用例執行通過&#xff0c;以此來需要人為分析的用例量&#xff0c;減少人力投入&#xff0c;提高執行效率&#xff1b; 在用例少或者資源消耗小…

Pr插件圖文安裝教程

Pr插件圖文安裝教程 Adobe Premiere Pro&#xff0c;簡稱Pr&#xff0c;是由Adobe公司開發的一款視頻編輯軟件。Adobe Premiere有較好的兼容性&#xff0c;且可以與Adobe公司推出的其他軟件相互協作。這款軟件廣泛應用于廣告制作和電視節目制作中&#xff0c;是視頻編輯愛好者…

[netty5: HttpObjectEncoder HttpObjectDecoder]-源碼解析

在閱讀該篇文章之前&#xff0c;推薦先閱讀以下內容&#xff1a; [netty5: HttpObject]-源碼解析[netty5: MessageToMessageCodec & MessageToMessageEncoder & MessageToMessageDecoder]-源碼分析[netty5: ByteToMessageCodec & MessageToByteEncoder & Byte…

uniapp的navigator跳轉功能

接下來&#xff0c;我將圍繞一個常見的電商小程序來構建一系列連貫的使用場景。在這個過程中&#xff0c;我們將把 <navigator> 組件的所有關鍵屬性和方法都串聯起來&#xff0c;并詳細解釋它們在每個環節所扮演的角色和作用。 核心場景&#xff1a;構建一個電商小程序的…

v-for的用法及案例

目錄 一.v-for的用法 1.舉例1 2.舉例2 二.購物車案例 1.代碼 2.存在的問題&#xff1a;復選框錯位 3.解決方案&#xff1a; 賦值給key屬性一個唯一的值 一.v-for的用法 1.舉例1 <template><view><view v-for"(item,index) in 10" :key"…

BigQuery對象引用(ObjectRef)全面指南:一站式整合結構化與非結構化多模態數據分析

引言 企業需要同時管理有組織表格中的結構化數據&#xff0c;以及日益增長的非結構化數據&#xff08;如圖片、音頻和文檔&#xff09;。傳統上&#xff0c;聯合分析這些多樣化數據類型非常復雜&#xff0c;通常需要使用不同的工具。非結構化媒體通常需要導出到專門的服務進行…