使用零拷貝對檔案高效的切片和合併

2021-10-07 16:11:26 字數 1654 閱讀 5622

對檔案的切片/合併在應用中是乙個很常見的需求,使用filechanneltransferto/transferfrom的零拷貝方法(需要作業系統支援),可以高效的完成。

/**

* 對檔案按照指定大小進行分片,在檔案所在目錄生成分片後的檔案塊兒

* @param file

* @param chunksize

* @throws ioexception

*/public

static

void

chunkfile

(path file,

long chunksize)

throws ioexception

if(chunksize <1)

// 原始檔案大小

final

long filesize = files.

size

(file)

;// 分片數量

final

long numberofchunk = filesize % chunksize ==

0? filesize / chunksize :

(filesize / chunksize)+1

;// 原始檔名稱

final string filename = file.

getfilename()

.tostring()

;// 讀取原始檔案

try(filechannel filechannel = filechannel.

open

(file, enumset.

of(standardopenoption.read)))

// 分片檔名稱

path chunkfile = paths.

get(filename +

"-"+

(i +1)

);try(filechannel chunkfilechannel = filechannel.

open

(file.

resolvesibling

(chunkfile)

, enumset.

of(standardopenoption.create_new, standardopenoption.write)))

}}}

/**

* 把多個檔案合併為乙個檔案

* @param file 目標檔案

* @param chunkfiles 分片檔案

* @throws ioexception

*/public

static

void mergefile (path file, path .

.. chunkfiles)

throws ioexception

try(filechannel filechannel = filechannel.

open

(file, enumset.

of(standardopenoption.create_new, standardopenoption.write)))

}}}

使用零拷貝對檔案高效的切片和合併

對檔案的切片 合併在應用中是乙個很常見的需求,使用filechannel的transferto transferfrom的零拷貝方法 需要作業系統支援 可以高效的完成。對檔案按照指定大小進行分片,在檔案所在目錄生成分片後的檔案塊兒 param file param chunksize throws ...

零拷貝 高效地傳輸檔案

基於使用者緩衝區傳輸檔案時,過多的記憶體拷貝與上下文切換次數會降低效能。零拷貝技術在核心中完成記憶體拷貝,天然降低了記憶體拷貝次數。它通過一次系統呼叫合併了磁碟讀取與網路傳送兩個操作,降低了上下文切換次數。尤其是,由於拷貝在核心中完成,它可以最大化使用 socket 緩衝區的可用空間,從而提高了一次...

如何高效傳輸檔案之零拷貝

pagecache 磁碟快取記憶體 大檔案零拷貝下的問題 非同步io 直接io 總結磁碟是主機中最慢的硬體,往往是效能的瓶頸,優化它能獲得立竿見影的效果。針對磁碟的優化技術有零拷貝 直接io 非同步io等 主要目的是為了降低時延 提公升作業系統的吞吐量,圍繞著核心的磁碟快取記憶體 pagecache...