簡體   English   中英

在 Linux 上快速連接多個文件

[英]Fast concatenate multiple files on Linux

我正在使用 Python 多處理為每個進程生成一個臨時 output 文件。 它們的大小可以是幾 GB,我做了幾十個。 需要連接這些臨時文件以形成所需的 output,這是被證明是瓶頸(和並行性殺手)的步驟。 是否有 Linux 工具可以通過修改文件系統元數據而不實際復制內容來創建連接文件? 只要它適用於我可以接受的任何 Linux 系統。 但是文件系統特定的解決方案不會有太大幫助。

我沒有受過操作系統或 CS 培訓,但從理論上講,似乎應該可以創建一個新的 inode 並從我要復制的文件的 inode 中復制 inode 指針結構,然后取消鏈接這些 inode。 是否有任何實用程序可以做到這一點? 鑒於經過深思熟慮的 unix 實用程序過多,我完全預料到它會是這樣,但找不到任何東西。 因此,我對 SO 的問題。 文件系統位於塊設備上,實際上是硬盤,以防此信息很重要。 我沒有信心自己寫這篇文章,因為我以前從未做過任何系統級編程,所以任何指針(指向 C/Python 代碼片段)都會非常有幫助。

即使有這樣的工具,這也只有在保證除最后一個文件之外的文件的大小是文件系統塊大小的倍數的情況下才有效。

如果您控制數據寫入臨時文件的方式,並且您知道每個文件的大小,則可以改為執行以下操作

  1. 在開始多處理之前,創建最終的 output 文件,並通過fseek()將其增長到最終大小,這將創建一個稀疏文件

  2. 開始多處理,將 FD 和偏移量交給每個進程到文件的特定切片中。

這樣,這些進程將協作填充單個 output 文件,無需稍后將它們集中在一起。

編輯

如果您無法預測單個文件的大小,但最終文件的使用者可以使用順序(而不是隨機訪問)輸入,您可以將cat tmpfile1.. tmpfileN提供給使用者,無論是在標准輸入上

cat tmpfile1 ... tmpfileN | consumer

或通過命名管道(使用 bash 的 Process Substitution):

consumer <(cat tmpfile1 ... tmpfileN)

您表示您事先不知道每個臨時文件的大小。 考慮到這一點,我認為最好的辦法是編寫一個FUSE文件系統,將塊呈現為單個大文件,同時將它們作為單獨的文件保存在底層文件系統上。

在此解決方案中,您的生產和消費應用程序保持不變。 生產者寫出一堆文件,FUSE 層使它們顯示為單個文件。 然后將該虛擬文件呈現給消費者。

FUSE 具有多種語言的綁定, 包括 Python 如果您在此處此處查看一些示例(這些示例用於不同的綁定),這需要非常少的代碼。

4個文件; xaa、xab、xac、xad 在 bash(作為 root)中的快速連接:

losetup -v -f xaa; losetup -v -f xab; losetup -v -f xac; losetup -v -f xad

(假設 loop0、loop1、loop2、loop3 是新設備文件的名稱。)

http://pastebin.com/PtEDQH7G放入“join_us”腳本文件中。 然后你可以像這樣使用它:

./join_us /dev/loop{0..3}

然后(如果這個大文件是電影)您可以將其所有權授予普通用戶(chown itsme /dev/mapper/joined),然后他/她可以通過以下方式播放它:mplayer /dev/mapper/joined

這些之后的清理(以root身份):

dmsetup remove joined; losetup -d /dev/loop[0123]

我不這么認為,inode 可能是對齊的,所以只有在你可以在一個文件的頁腳和另一個文件的 header 之間留下一些零(或未知字節)的情況下才有可能。

我建議不要連接這些文件,而是重新設計分析工具以支持從多個文件中進行采購。 以日志文件為例,很多日志分析器支持每天讀取日志文件。

編輯

@san:正如您所說,您無法控制正在使用的代碼,您可以使用命名管道即時連接單獨的文件:

$ mkfifo /tmp/cat
$ cat file1 file2 ... >/tmp/cat &
$ user_program /tmp/cat
...
$ rm /tmp/cat

不,沒有這樣的工具或系統調用。

您可能會調查每個進程是否可以直接寫入最終文件。 假設進程 1 寫入字節 0-X,進程 2 寫入 X-2X,依此類推。

一種可能的替代方法是將所有臨時文件分類到名為 pipe 的文件中,然后使用名為 pipe 的文件作為單輸入程序的輸入。 只要您的單輸入程序只是按順序讀取輸入並且不查找。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM