輸入 / 輸出與檔案系統#
Arrow 提供一系列 C++ 介面,抽象化輸入 / 輸出操作的具體細節。它們操作非類型化的二進制資料流。這些抽象化用於各種目的,例如讀取 CSV 或 Parquet 資料、傳輸 IPC 資料流等等。
另請參閱
讀取二進制資料#
用於讀取二進制資料的介面有兩種形式:
循序讀取:
InputStream
介面提供Read
方法;建議Read
到Buffer
,因為在某些情況下,它可以避免記憶體複製。隨機存取讀取:
RandomAccessFile
介面提供額外的定位功能,最重要的是,ReadAt
方法,允許從多個執行緒並行讀取。
具體實作可用於 記憶體內 讀取
、非緩衝 檔案 讀取
、記憶體映射 檔案 讀取
、緩衝 讀取
、壓縮 讀取
。
寫入二進制資料#
寫入二進制資料主要透過 OutputStream
介面完成。
具體實作可用於 記憶體內 寫入
、非緩衝 檔案 寫入
、記憶體映射 檔案 寫入
、緩衝 寫入
、壓縮 寫入
。
檔案系統#
檔案系統 介面
允許對各種資料儲存後端(例如本機檔案系統或 S3 儲存桶)進行抽象化的存取。它提供輸入和輸出資料流以及目錄操作。
另請參閱
檔案系統介面公開了底層資料儲存的簡化視圖。資料路徑表示為抽象路徑,即使在 Windows 上也是 /
分隔的,並且不應包含特殊的路徑組件,例如 .
和 ..
。符號連結(如果底層儲存支援)會自動取消引用。僅提供有關檔案條目的基本 metadata
,例如檔案大小和修改時間。
檔案系統實例可以使用 URI 字串,透過 FromUri 工廠函數 之一來建構,這些工廠函數會根據 URI 的 scheme
分派到特定於實作的工廠。新實例的其他屬性是從 URI 的其他屬性中提取的,例如 hostname
、username
等。Arrow 支援新檔案系統的執行階段註冊,並為多個檔案系統提供內建支援。
支援哪些內建檔案系統是在建置時配置的,可能包括 本機 檔案系統 存取
、HDFS
、Amazon S3 相容 儲存
和 Google 雲端 儲存空間
。
注意
使用檔案系統的任務通常會在 I/O 執行緒池 上執行。對於支援高並行等級的檔案系統,您可以從增加 I/O 執行緒池的大小中獲益。
定義新的檔案系統#
可以透過為每個新的 URI 方案註冊一個工廠,使用 RegisterFileSystemFactory()
,將對其他 URI 方案的支援添加到 FromUri 工廠函數。為了啟用常見情況,即偏好自動註冊,可以在命名空間範圍內定義 FileSystemRegistrar
的實例,這將在每次載入實例時註冊一個工廠
auto kExampleFileSystemModule = ARROW_REGISTER_FILESYSTEM(
"example",
[](const Uri& uri, const io::IOContext& io_context,
std::string* out_path) -> Result<std::shared_ptr<arrow::fs::FileSystem>> {
EnsureExampleFileSystemInitialized();
return std::make_shared<ExampleFileSystem>();
},
&EnsureExampleFileSystemFinalized
);
如果檔案系統實作在可以建構任何實例之前需要初始化,則應將其包含在相應的工廠中,或在調用工廠之前以其他方式自動確保。同樣地,如果檔案系統實作在程序結束之前需要拆解,則可以將其包裝在函數中,並與工廠一起註冊。所有終結器都將由 EnsureFinalized()
呼叫。
透過將檔案系統實作劃分到單獨的共享函式庫中,可以降低建置複雜性,應用程式可以動態連結或載入該函式庫。Arrow 的內建檔案系統實作也遵循這種模式。如果包含 FileSystemRegistrar
實例的共享函式庫必須動態載入,則應使用 LoadFileSystemFactories()
來載入它。如果這樣的函式庫可能會靜態連結到 arrow,則它應該只有一個來源 #include "arrow/filesystem/filesystem_library.h"
,以確保 LoadFileSystemFactories()
所依賴的符號存在。