資料寫入規則IBufferWriter

2021-10-18 13:32:34 字數 1869 閱讀 9364

ibufferwriter從名字上看大概已經猜到作用,這個介面是在.net standard 2.1作為標準支援。那這個介面的實際使用場和作用是什麼?在了解之前先看一下system.text.json的一些**:

public sealed class utf8jsonwriter : iasyncdisposable, idisposable

以下是.net core針對json序列化的資料寫入物件,有兩個造函式分別是stream和ibufferwriter。stream相信不用介紹了,它是基礎資料流讀寫規範,基本它派生出來的有filestream,memorystream,networkstream等等,通過這個讀寫規範的抽象可以在讀寫資料的時候完全不用關心實際的資料來源。那為什麼要現在要引入ibufferwriter,它的好處是在那裡?

ibufferwriter

在了解它之前需要知道它具體的作用是什麼,以下是介面的定義

public inte***ce ibufferwriter
ibufferwriter的行為介面規範很簡單,兩個分配記憶體空間的方法,和乙個確定寫入資料數量的方法。簡單來說使用不管記憶體分配的,需要的時候從相關方法獲取記憶體空間,當記憶體空間操作完成後通過advance方法告訴給提供。

stream

在對比差別之前先看一下stream的寫入方法是怎樣的

public abstract void write(byte buffer, int offset, int count);

public virtual void write(readonlyspanbuffer);

public task writeasync(byte buffer, int offset, int count);

public virtual valuetask writeasync(readonlymemorybuffer, cancellationtoken cancellationtoken = default);

public virtual void writebyte(byte value);

以上是stream寫入資料的規範,它提供了一系列針對bytes的寫入操作。

兩者的差別

通過兩者的提供的方法,否能了解streram和ibufferwriter的差別?其實兩者的功能都是資料寫入,stream規範了資料寫入方式,但無法給外部分配記憶體;而ibufferwriter則規範了對外的分配記憶體,但並沒有規範資料寫入方式。

顯然stream在寫入上更規範,但為什麼還要定義ibufferwriter?其實一切都是為了效能!由於stream給外部申請記憶體空間,就意味著所有的寫入行為都是對引數buffer乙個拷貝;而ibufferwriter則有所不同,它只管理空間分配和最終提交數量,在寫的過程中並不管控處理,使用者在獲取分配的空間後即可直接操作。

使用

既然這個規範是為了提高效能,而dotnet core的元件又開始支援,所以beetlex在計畫的版本中也相應支援

}以上是system.text.json使用beetlex pipestream基於ibufferwrite的擴充套件,其實原理是jsonserializer從ibufferwriter中獲取一小塊記憶體,寫滿後提交然後再次申請寫入,直到整個物件的序列化完成。

將不規則Excel檔案資料寫入資料庫

此次是要將以下excel檔案裡面的資料寫入火車訂票系統資料庫表裡面。那我們先來看看是什麼樣子的excel資料。這個檔案裡面共有2個工作表,裡面的資料按上圖樣式排列。接下來看我們要匯入的資料庫表。上圖有3張表,其中traintype為火車型別表,儲存的是火車的型別,比如普通車,動車組等。traintr...

python 寫入資料

呼叫 open 時提供了兩個實參第乙個實參也是要開啟的檔案的名稱 第二個實參 w 告訴 python 我們要以 寫入模式 開啟這個檔案。開啟檔案時,可指定 讀取模式 r 寫入模式 w 附加模式 a 或讓你能夠讀取和寫入檔案的模式 r 如果你省略了模式實參,python 將以預設的唯讀模式開啟檔案。如...

hive 資料寫入

hive表中資料的寫入主要有 insert into overwrite values insert select load create table as select datatable 這幾種方式。其中hive從0.14版本開始支援 insert into table values line ...