Saya punya 10k + file dengan total lebih dari 20GB yang harus saya gabungkan menjadi satu file.
Apakah ada cara yang lebih cepat daripada
cat input_file* >> out
?
Cara yang disukai adalah perintah bash, Python juga dapat diterima jika tidak terlalu lambat.
bash
shell-script
files
cat
fsperrle
sumber
sumber
find
tidak mengurutkan file sama dengan shell glob.out
terletak di disk lain.Jawaban:
Tidak, kucing pasti cara terbaik untuk melakukan ini. Mengapa menggunakan python ketika ada program yang sudah ditulis dalam C untuk tujuan ini? Namun, Anda mungkin ingin mempertimbangkan untuk menggunakan
xargs
jika panjang baris perintah melebihiARG_MAX
dan Anda membutuhkan lebih dari satucat
. Menggunakan alat GNU, ini setara dengan apa yang sudah Anda miliki:sumber
find
disalurkan melaluisort
. Tanpa ini, file akan terdaftar dalam urutan sewenang-wenang (ditentukan oleh sistem file, yang bisa menjadi urutan pembuatan file).bash
bola dunia. Kalau tidak, saya tidak melihat kasus di manaxargs
ataucat
tidak akan berperilaku seperti yang diharapkan.xargs
akan memanggil sesering mungkincat
untuk menghindari kesalahan eksekusi E2BIG (2).Mengalokasikan ruang untuk file output terlebih dahulu dapat meningkatkan kecepatan keseluruhan karena sistem tidak perlu memperbarui alokasi untuk setiap penulisan.
Misalnya, jika di Linux:
Manfaat lain adalah bahwa jika tidak ada cukup ruang kosong, salinan tidak akan dicoba.
Jika aktif
btrfs
, Anda dapatcopy --reflink=always
menggunakan file pertama (yang tidak mengandung salinan data dan karena itu akan hampir instan), dan menambahkan sisanya. Jika ada 10.000 file, itu mungkin tidak akan membuat banyak perbedaan meskipun kecuali file pertama sangat besar.Ada API untuk menggeneralisasi itu untuk menyalin ulang semua file (the
BTRFS_IOC_CLONE_RANGE
ioctl
), tapi saya tidak dapat menemukan utilitas yang mengekspos API itu, jadi Anda harus melakukannya dalam C (ataupython
atau bahasa lain asalkan mereka dapat memanggilioctl
s sewenang-wenang ) .Jika file sumber jarang atau memiliki urutan besar karakter NUL, Anda bisa membuat file output jarang (menghemat waktu dan ruang disk) dengan (pada sistem GNU):
sumber
>
juga>>
, tetapi1<>
seperti yang saya katakan untuk menulis ke dalam file.<>
adalah operator redirection read + write Bourne / POSIX standar. Lihat manual shell Anda atau spesifikasi POSIX untuk detailnya. Defaultnyafd
adalah0
untuk<>
operator (<>
kependekan dari0<>
, suka<
adalah kependekan0<
dan>
kependekan dari1>
), jadi Anda perlu1
untuk secara langsung mengarahkan stdout. Di sini, kita tidak perlu membaca + tulis (O_RDWR
), tetapi kita tidak menginginkanO_TRUNC
(seperti pada>
) yang akan membatalkan alokasi yang baru saja kita alokasikan.dd
atau melalui membaca.fallocate
akan meniadakan overhead tambahanfind
, meskipun akan lebih cepat pada putaran kedua.btrfs
tentu membuka beberapa kemungkinan menarik.