戰(zhàn)與 Instant-NGP 集成)
人工智能深度學(xué)習(xí)計算機(jī)視覺3D渲染圖形學(xué)科研【免費(fèi)下載鏈接】instant-ngpInstant neural graphics primitives: lightning fast NeRF and more項(xiàng)目地址https://gitcode.com/gh_mirrors/in/instant-ngp點(diǎn)擊查看免費(fèi)下載TinyEXR 是一個零外部依賴、以單個頭文件分發(fā)的 OpenEXR.exr圖像讀寫庫采用可移植 C 編寫除 STL 外不依賴任何第三方庫。本文以dependencies/tinyexr/README.md為主體骨架完整講解其格式支持矩陣、編譯開關(guān)、從快速讀取到深圖像讀寫的全套 API 用法并結(jié)合本倉庫instant-ngp中 tinyexr_wrapper.cu 等源碼剖析它在 HDR 環(huán)境貼圖、訓(xùn)練圖像加載等真實(shí)場景中的落地方式。讀完本文你將能夠獨(dú)立將 TinyEXR 嵌入自己的項(xiàng)目并理解 instant-ngp 內(nèi)部 EXR 數(shù)據(jù)的完整流轉(zhuǎn)鏈路。一、TinyEXR 是什么tinyexr是一個用于加載與保存 OpenEXR.exr圖像的小型單頭文件庫其核心頭文件位于 dependencies/tinyexr/tinyexr.h。它的設(shè)計目標(biāo)非常明確可移植、易嵌入。整個庫以可移植 C 寫成除了 STL 之外沒有庫依賴使用時只需把tinyexr.h復(fù)制到你的項(xiàng)目里即可README 明確說明 To usetinyexr, simply copytinyexr.hinto your project.。與龐大的 OpenEXR 官方實(shí)現(xiàn)IlmImf相比TinyEXR 的價值在于單頭文件分發(fā)無需復(fù)雜的依賴鏈和構(gòu)建系統(tǒng)一個頭文件即完整實(shí)現(xiàn)無外部依賴默認(rèn)內(nèi)置 miniz 處理 ZIP/ZIPS 壓縮不需要單獨(dú)鏈接 zlibC 接口友好README 指出其提供 C 接口便于為其他語言如 golang編寫綁定性能優(yōu)化支持 C11 線程加載與 OpenMP 多線程讀寫。需要說明的是README 特別提示API 仍可能變動API is still subject to change細(xì)節(jié)請以源碼為準(zhǔn)。二、格式與功能支持矩陣README 用清單方式完整列出了當(dāng)前實(shí)現(xiàn)狀態(tài)這是評估 TinyEXR 能力邊界的第一手資料整理如下功能類別已支持未支持/待實(shí)現(xiàn)OpenEXR v1 圖像掃描線Scanline格式、自定義屬性Custom attributes、無 LoD 的 Tiled 格式加載Tiled 帶 LoD 加載、Tiled 保存含/不含 LoDOpenEXR v2 圖像加載多部件Multipart圖像保存多部件圖像、多部件深圖像讀寫Deep 深圖像加載掃描線 ZIPS HALF 或 FLOAT 像素類型深圖像保存、UINT/FLOAT 深圖像保存壓縮方式NONE、RLE、ZIP、ZIPS、PIZ以及 TinyEXR 擴(kuò)展的 ZFPB44、B44A、PIX24行序Line order遞增、遞減加載隨機(jī)行序、遞增/遞減保存像素格式UINT、FLOAT加載/保存UINT、FLOAT深圖像加載深圖像保存大端機(jī)器掃描線圖像加載與保存多部件通道 EXR、深圖像的加載與保存優(yōu)化C11 線程加載、OpenMP 多線程 EXR 加載/保存C11 線程保存、ISPC、深圖像多線程從tinyexr.h源碼可以印證上述像素類型的定義tinyexr.h// pixel type: possible values are: UINT 0 HALF 1 FLOAT 2 #define TINYEXR_PIXELTYPE_UINT (0) #define TINYEXR_PIXELTYPE_HALF (1) #define TINYEXR_PIXELTYPE_FLOAT (2)理解這張表的意義在于如果你的業(yè)務(wù)需要讀寫 Tiled 帶 mipmap 的 EXR、多部件保存或深圖像保存TinyEXR 目前無法勝任應(yīng)改用官方 OpenEXR 庫反之常見的單部件掃描線 RGBA 圖像、HDR 幀序列、環(huán)境貼圖TinyEXR 是輕量高效的選擇。三、快速集成與編譯開關(guān)3.1 引入方式在一個.cc/.cu 文件中定義TINYEXR_IMPLEMENTATION宏后再包含頭文件其余文件直接包含頭文件即可// 若你關(guān)閉 TINYEXR_USE_MINIZ則需在包含 tinyexr.h 之前 // 自行包含 zlib 兼容的 API 頭文件 // #define TINYEXR_USE_MINIZ 0 // #include zlib.h #define TINYEXR_IMPLEMENTATION #include tinyexr.h本倉庫正是這樣做的在 src/tinyexr_wrapper.cu 中TINYEXR_IMPLEMENTATION被定義后引入tinyexr/tinyexr.h從而在整個 instant-ngp 中只實(shí)例化一次 TinyEXR 實(shí)現(xiàn)其余模塊通過 include/neural-graphics-primitives/tinyexr_wrapper.h 聲明的接口調(diào)用。3.2 編譯宏README 列出的五個編譯宏及其默認(rèn)值如下宏默認(rèn)值作用TINYEXR_USE_MINIZ1使用內(nèi)置 miniz 處理壓縮。置 0 時需在tinyexr.h之前自行包含zlib.hTINYEXR_USE_PIZ1啟用 PIZ 壓縮支持TINYEXR_USE_ZFP0啟用 ZFP 壓縮TinyEXR 擴(kuò)展默認(rèn)關(guān)閉TINYEXR_USE_THREAD0啟用基于 C11 線程的并行加載要求 C11 編譯器TINYEXR_USE_OPENMP1若定義了_OPENMP啟用 OpenMP 多線程可用TINYEXR_USE_OPENMP0強(qiáng)制關(guān)閉這些默認(rèn)值在 tinyexr.h 中有對應(yīng)實(shí)現(xiàn)例如TINYEXR_USE_OPENMP是依據(jù)編譯器是否定義_OPENMP自動決定的。在 CUDA 項(xiàng)目中編譯器不一定定義_OPENMP因此 OpenMP 路徑通常不會生效這是正常的。四、API 實(shí)戰(zhàn)讀取 EXR4.1 最快路徑LoadEXR一鍵讀取 RGBA如果你只需要把一張 EXR 讀成width * height * RGBA的 float 數(shù)組LoadEXR是最簡單的方式const char* input asakusa.exr; float* out; // width * height * RGBA int width; int height; const char* err NULL; // C11 中可用 nullptr int ret LoadEXR(out, width, height, input, err); if (ret ! TINYEXR_SUCCESS) { if (err) { fprintf(stderr, ERR : %s\n, err); FreeEXRErrorMessage(err); // 釋放錯誤信息內(nèi)存 } } else { // ... 使用 out free(out); // 釋放圖像數(shù)據(jù)內(nèi)存 }注意三個內(nèi)存管理約定錯誤信息用FreeEXRErrorMessage釋放、圖像數(shù)據(jù)用free釋放、出錯時err可能非空但out無有效數(shù)據(jù)。4.2 分層 EXRLoadEXRWithLayer當(dāng) EXR 的通道名包含.分隔符如diffuse.R、diffuse.G時需要用分層讀取接口。層名需要提前獲知可通過EXRLayersAPI 枚舉const char* input ...; const char* layer_name diffuse; // 或先用 EXRLayers 獲取 EXR 中的層名列表 float* out; // width * height * RGBA int width; int height; const char* err NULL; // 將讀取 diffuse.R、diffuse.G、diffuse.B、如有則 diffuse.A通道 int ret LoadEXRWithLayer(out, width, height, input, layer_name, err); // 錯誤處理與釋放方式同 LoadEXR4.3 標(biāo)準(zhǔn)流程單部件 EXR 的完整加載當(dāng)需要精細(xì)控制例如檢查版本、讀取 HALF 為 FLOAT、區(qū)分 scanline 與 tiled時使用分段 API。該流程分為“解析版本 → 解析頭 → 加載圖像 → 釋放”四步// 1. 讀取 EXR 版本 EXRVersion exr_version; int ret ParseEXRVersionFromFile(exr_version, argv[1]); if (ret ! 0) { fprintf(stderr, Invalid EXR file: %s\n, argv[1]); return -1; } if (exr_version.multipart) { // 單部件流程要求 multipart 標(biāo)志為 false return -1; } // 2. 讀取 EXR 頭 EXRHeader exr_header; InitEXRHeader(exr_header); const char* err NULL; ret ParseEXRHeaderFromFile(exr_header, exr_version, argv[1], err); if (ret ! 0) { fprintf(stderr, Parse EXR err: %s\n, err); FreeEXRErrorMessage(err); return ret; } // // 將 HALF 通道按 FLOAT 讀取按需啟用 // for (int i 0; i exr_header.num_channels; i) { // if (exr_header.pixel_types[i] TINYEXR_PIXELTYPE_HALF) { // exr_header.requested_pixel_types[i] TINYEXR_PIXELTYPE_FLOAT; // } // } EXRImage exr_image; InitEXRImage(exr_image); ret LoadEXRImageFromFile(exr_image, exr_header, argv[1], err); if (ret ! 0) { fprintf(stderr, Load EXR err: %s\n, err); FreeEXRHeader(exr_header); FreeEXRErrorMessage(err); return ret; } // 3. 訪問圖像數(shù)據(jù) // exr_image.images 在 EXR 為 scanline 格式時填充 // exr_image.tiled 在 EXR 為 tiled 格式時填充 // 4. 釋放 FreeEXRImage(exr_image); FreeEXRHeader(exr_header);這里體現(xiàn)了一個重要機(jī)制EXRHeader.pixel_types表示文件中的原始像素類型而requested_pixel_types表示你希望以什么類型讀出加載時通道數(shù)據(jù)會按requested_pixel_types進(jìn)行轉(zhuǎn)換tinyexr.h 中對此有明確注釋。4.4 多部件MultipartEXR 加載EXR 2.0 的 multipart 文件包含多個獨(dú)立 part。加載流程是先解析版本并確認(rèn)multipart為 true再用ParseEXRMultipartHeaderFromFile一次性解析出所有 part 的頭EXRVersion exr_version; int ret ParseEXRVersionFromFile(exr_version, argv[1]); if (ret ! 0) { return -1; } if (!exr_version.multipart) { return -1; } // 必須為 multipart EXRHeader **exr_headers; // EXRHeader 指針數(shù)組 int num_exr_headers; const char *err NULL; // EXRHeader 的內(nèi)存由 ParseEXRMultipartHeaderFromFile 內(nèi)部分配 ret ParseEXRMultipartHeaderFromFile(exr_headers, num_exr_headers, exr_version, argv[1], err); if (ret ! 0) { fprintf(stderr, Parse EXR err: %s\n, err); FreeEXRErrorMessage(err); return ret; } printf(num parts %d\n, num_exr_headers); // 3. 加載圖像為每個 part 準(zhǔn)備 EXRImage std::vectorEXRImage images(num_exr_headers); for (int i 0; i num_exr_headers; i) { InitEXRImage(images[i]); } ret LoadEXRMultipartImageFromFile(images.at(0), const_castconst EXRHeader**(exr_headers), num_exr_headers, argv[1], err); if (ret ! 0) { fprintf(stderr, Parse EXR err: %s\n, err); FreeEXRErrorMessage(err); return ret; } printf(Loaded %d part images\n, num_exr_headers); // 5. 依次釋放圖像與頭 for (int i 0; i num_exr_headers; i) { FreeEXRImage(images.at(i)); } for (int i 0; i num_exr_headers; i) { FreeEXRHeader(exr_headers[i]); free(exr_headers[i]); } free(exr_headers);需要特別留意的是所有權(quán)邊界ParseEXRMultipartHeaderFromFile分配的EXRHeader數(shù)組最終要逐個FreeEXRHeader后再free指針本身最后釋放數(shù)組指針避免泄漏。五、API 實(shí)戰(zhàn)保存掃描線 EXR保存流程與加載對稱初始化EXRHeader與EXRImage把交錯的 RGB 拆成獨(dú)立的 R/G/B 通道平面再調(diào)用SaveEXRImageToFile。README 給出的完整示例核心邏輯如下bool SaveEXR(const float* rgb, int width, int height, const char* outfilename) { EXRHeader header; InitEXRHeader(header); EXRImage image; InitEXRImage(image); image.num_channels 3; std::vectorfloat images[3]; images[0].resize(width * height); images[1].resize(width * height); images[2].resize(width * height); // 把 RGBRGBRGB... 交錯數(shù)據(jù)拆成 R、G、B 三個平面 for (int i 0; i width * height; i) { images[0][i] rgb[3*i0]; images[1][i] rgb[3*i1]; images[2][i] rgb[3*i2]; } float* image_ptr[3]; image_ptr[0] (images[2].at(0)); // B image_ptr[1] (images[1].at(0)); // G image_ptr[2] (images[0].at(0)); // R image.images (unsigned char**)image_ptr; image.width width; image.height height; header.num_channels 3; header.channels (EXRChannelInfo *)malloc(sizeof(EXRChannelInfo) * header.num_channels); // 必須是 (A)BGR 順序因?yàn)榇蠖鄶?shù) EXR 查看器期望這個通道順序 strncpy(header.channels[0].name, B, 255); header.channels[0].name[strlen(B)] \0; strncpy(header.channels[1].name, G, 255); header.channels[1].name[strlen(G)] \0; strncpy(header.channels[2].name, R, 255); header.channels[2].name[strlen(R)] \0; header.pixel_types (int *)malloc(sizeof(int) * header.num_channels); header.requested_pixel_types (int *)malloc(sizeof(int) * header.num_channels); for (int i 0; i header.num_channels; i) { header.pixel_types[i] TINYEXR_PIXELTYPE_FLOAT; // 輸入圖像像素類型 header.requested_pixel_types[i] TINYEXR_PIXELTYPE_HALF; // 寫入 .EXR 文件的輸出像素類型 } const char* err NULL; int ret SaveEXRImageToFile(image, header, outfilename, err); if (ret ! TINYEXR_SUCCESS) { fprintf(stderr, Save EXR err: %s\n, err); FreeEXRErrorMessage(err); return ret; } printf(Saved exr file. [ %s ] \n, outfilename); free(rgb); free(header.channels); free(header.pixel_types); free(header.requested_pixel_types); }兩個關(guān)鍵實(shí)踐要點(diǎn)通道命名與順序EXR 查看器普遍期望 (A)BGR 順序因此header.channels[0]寫 B、channels[1]寫 G、channels[2]寫 R同時image_ptr也按 B、G、R 排列指向?qū)?yīng)平面HALF 輸出把requested_pixel_types設(shè)為TINYEXR_PIXELTYPE_HALF即可在保存時把 FLOAT 數(shù)據(jù)降為 HALF16 位浮點(diǎn)這是 HDR 圖像文件的標(biāo)準(zhǔn)做法文件體積減半而視覺精度幾乎無損。六、Deep 深圖像讀取深圖像deep image每個像素包含可變數(shù)量的采樣點(diǎn)。加載后通過offset_table定位每個像素的采樣區(qū)間再按通道讀取樣本值。README 給出的訪問模式如下const char* input deepimage.exr; const char* err NULL; DeepImage deepImage; int ret LoadDeepEXR(deepImage, input, err); // 訪問深像素中的每個采樣點(diǎn) for (int y 0; y deepImage.height; y) { int sampleNum deepImage.offset_table[y][deepImage.width-1]; for (int x 0; x deepImage.width-1; x) { int s_start deepImage.offset_table[y][x]; int s_end deepImage.offset_table[y][x1]; if (s_start sampleNum) { continue; } s_end (s_end sampleNum) ? s_end : sampleNum; for (int s s_start; s s_end; s) { float val deepImage.image[depthChan][y][s]; // ... } } }這里offset_table[y][x]到offset_table[y][x1]之間的整數(shù)區(qū)間就是像素(x, y)的采樣點(diǎn)索引范圍用sampleNum本行最后一個像素的累計采樣數(shù)做邊界裁剪即可安全遍歷。README 提到examples/deepview是配套的 OpenGL 深圖像查看器示例該示例位于 TinyEXR 上游倉庫的 examples 目錄當(dāng)前倉庫快照未包含該目錄。七、TinyEXR 擴(kuò)展ZFP 有損壓縮ZFP 是 TinyEXR 對 OpenEXR 規(guī)范之外的自定義擴(kuò)展用于對 FLOAT 像素做塊式有損壓縮4×4 像素塊僅支持 Linux 與 macOS。其約束與構(gòu)建步驟在 README 中有明確說明。約束僅支持 FLOAT 像素格式圖像寬高必須是 4 的倍數(shù)因?yàn)?ZFP 以 4×4 像素塊為單位壓縮。構(gòu)建當(dāng)前倉庫已內(nèi)置 ZFP 源碼于 dependencies/tinyexr/deps/ZFP$ git submodule update --init # 若 ZFP 以子模塊方式檢出 $ cd deps/ZFP $ mkdir -p lib # 若 lib 目錄不存在則創(chuàng)建 $ make然后將 tinyexr.h 中的TINYEXR_USE_ZFP設(shè)為 1并在構(gòu)建應(yīng)用時鏈接deps/ZFP/lib/libzfp.a。ZFP 屬性約定ZFP 壓縮的 EXR 必須包含如下自定義屬性屬性名類型含義zfpCompressionTypeuchar0 固定速率壓縮1 基于精度的可變速率壓縮2 基于誤差容忍的可變速率壓縮zfpCompressionRatedouble固定速率壓縮的壓縮率類型為 0 時存在zfpCompressionPrecisionint32基于精度的可變速率壓縮的位數(shù)類型為 1 時存在zfpCompressionTolerancedouble基于誤差容忍壓縮的容忍值類型為 2 時存在其中zfpCompressionType必選其余三個屬性按類型三選一。README 還指出 ZFP 壓縮器本身在大端機(jī)器上工作正常而 TinyEXR 的 ZFP 擴(kuò)展整體仍是實(shí)驗(yàn)性支持。八、在 instant-ngp 中的真實(shí)集成從 EXR 到 GPU 訓(xùn)練數(shù)據(jù)TinyEXR 在本倉庫instant-ngp中扮演 HDR 圖像基礎(chǔ)庫的角色其價值從源碼調(diào)用鏈中可以清晰看到。8.1 封裝層NVIDIA 為 instant-ngp 封裝了三個高層接口聲明在 include/neural-graphics-primitives/tinyexr_wrapper.h實(shí)現(xiàn)在 src/tinyexr_wrapper.cusave_exr(...)把 FLOAT 數(shù)據(jù)按 (A)BGR 通道序保存為 HALF 型 EXR與 README 示例完全一致見tinyexr_wrapper.cu中channel_names的倒序命名與requested_pixel_types TINYEXR_PIXELTYPE_HALFload_exr(...)讀文件到內(nèi)存并用LoadEXRFromMemory解析出 RGBA float 數(shù)據(jù)load_exr_to_gpu(...)內(nèi)存版全流程——ParseEXRVersionFromMemory→ParseEXRHeaderFromMemory→LoadEXRImageFromMemory逐通道cudaMemcpy到 GPU再由 CUDA kernelinterleave_and_cast_kernel把平面數(shù)據(jù)交錯為 RGBA 并轉(zhuǎn)為__half同時支持fix_premult預(yù)乘修正。封裝層還體現(xiàn)了幾條實(shí)用的工程約束拒絕 multipart 文件exr_version.multipart為真即拋異常、拒絕混合通道類型所有通道必須同為 FLOAT 或同為 HALF否則報 Cant handle EXR images with mixed channel types。這些約束與 README 中“單部件加載”的流程一脈相承。8.2 在 NeRF / 圖像測試臺中的使用訓(xùn)練圖像加載src/nerf_loader.cu 中當(dāng) NeRF 數(shù)據(jù)集幀圖像的擴(kuò)展名是exr時調(diào)用load_exr_to_gpu將 HDR 圖像直接載入 GPU 并標(biāo)記為EImageDataType::Half、is_hdr true環(huán)境貼圖加載src/nerf_loader.cu 中transforms.json 里envmap字段指向.exr時通過load_exr_gpu見 src/common_host.cu加載 HDR 環(huán)境光圖像模式src/testbed_image.cu 的load_image根據(jù)擴(kuò)展名分發(fā).exr走load_exr_image路徑加載結(jié)果作為待擬合的 HDR 圖像倉庫自帶的示例數(shù)據(jù) data/image/albert.exr 正是這一模式的標(biāo)準(zhǔn)輸入模型權(quán)重導(dǎo)出src/testbed.cu 使用save_exr把神經(jīng)網(wǎng)絡(luò)各層參數(shù)與 non-layer 參數(shù)分別導(dǎo)出為*-layer-*.exr與*-non-layer.exr利用 HALF 精度壓縮權(quán)重文件體積。因此configs/image/base.json 這類圖像擬合配置即可直接消費(fèi) EXR 輸入——它定義的是 HashGrid 編碼 兩層 64 神經(jīng)元 MLP 的擬合網(wǎng)絡(luò)EXR 的 HDR 動態(tài)范圍正是這類圖像學(xué)習(xí)任務(wù)需要保留的關(guān)鍵信息。九、測試、實(shí)驗(yàn)與周邊單元測試README 指出單元測試位于上游的test/unit目錄當(dāng)前倉庫快照中與之對應(yīng)的可直接構(gòu)建的測試入口是 dependencies/tinyexr/test_tinyexr.cc配套 Makefile 可用于本地構(gòu)建驗(yàn)證JS 移植上游 README 提到基于 Emscripten 的 JavaScript 移植位于上游experimental/js當(dāng)前倉庫保留了對應(yīng)的 experimental/js 目錄包含binding.cc、compile_to_js.sh與index.html等Android JNIjni 目錄提供 Android.mk/Application.mk 構(gòu)建腳本說明 TinyEXR 可在移動端嵌入許可TinyEXR 采用 3-clause BSD 許可見 LICENSE.txt內(nèi)部使用 Rich Geldreich 開發(fā)的公有領(lǐng)域 miniz工具部分使用公有領(lǐng)域的 stb并含少量來自 OpenEXR3-clause BSD的代碼——這也是它適合商業(yè)嵌入的許可基礎(chǔ)。十、總結(jié)與選型建議TinyEXR 以“單頭文件 零依賴”的極簡形態(tài)覆蓋了 OpenEXR 日常讀寫的大部分需求掃描線與無 LoD 平鋪格式加載、NONE/RLE/ZIP/ZIPS/PIZ 壓縮、HALF/FLOAT/UINT 像素、多部件加載、深圖像加載以及 ZFP 有損壓縮擴(kuò)展。在 instant-ngp 中它承擔(dān)了 HDR 圖像從磁盤到 GPU 顯存的全鏈路職責(zé)是 NeRF 訓(xùn)練與環(huán)境貼圖渲染的重要基礎(chǔ)組件。選型時請對照第二節(jié)的支持矩陣需要保存多部件/深圖像、Tiled 帶 LoD 或 B44/B44A 壓縮時TinyEXR 尚不支持應(yīng)評估官方 OpenEXR而追求嵌入輕量、快速讀取 HDR 幀序列與掃描線 EXR 時TinyEXR 是經(jīng)過 instant-ngp 生產(chǎn)驗(yàn)證的可靠選擇。若需深入了解 API 細(xì)節(jié)請直接閱讀 tinyexr.h 中的函數(shù)注釋與常量定義。贊分享人工智能深度學(xué)習(xí)計算機(jī)視覺3D渲染圖形學(xué)科研【免費(fèi)下載鏈接】instant-ngpInstant neural graphics primitives: lightning fast NeRF and more項(xiàng)目地址https://gitcode.com/gh_mirrors/in/instant-ngp點(diǎn)擊查看免費(fèi)下載相關(guān)推薦Apache Arrow文件格式支持Parquet、CSV等格式讀寫指南Apache Arrow文件格式支持Parquet、CSV等格式讀寫指南 概述 Apache Arrow是一個跨語言的內(nèi)存格式主要用于高效地傳輸和存儲數(shù)據(jù)。大數(shù)據(jù)數(shù)據(jù)分析數(shù)據(jù)工程序列化instant-ngp 中的 NaturalSortC 單頭文件自然排序庫的 API、算法原理與 NeRF 數(shù)據(jù)加載實(shí)踐instant ngp 中的 NaturalSortC 單頭文件自然排序庫的 API、算法原理與 NeRF 數(shù)據(jù)加載實(shí)踐 導(dǎo)讀 NaturalSort 是人工智能深度學(xué)習(xí)計算機(jī)視覺3D渲染圖形學(xué)科研Apache Arrow C IPC 讀寫 API 實(shí)戰(zhàn)流式格式與文件格式的完整解析Apache Arrow C IPC 讀寫 API 實(shí)戰(zhàn)流式格式與文件格式的完整解析 Apache Arrow 的 IPCInter Process C大數(shù)據(jù)數(shù)據(jù)分析數(shù)據(jù)工程序列化上一篇Flexile服務(wù)發(fā)現(xiàn)動態(tài)服務(wù)注冊與發(fā)現(xiàn)下一篇Flexile網(wǎng)絡(luò)防護(hù)網(wǎng)絡(luò)攻擊防護(hù)與WAF配置創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考