प्रदर्शन बफर आकार पर बहुत अधिक निर्भर है। वे डिफ़ॉल्ट रूप से काफी छोटे हैं। 2x2 जीबी फाइलों को जोड़ना मैं लगभग 256 केबी का बफर लेना चाहता हूं। बड़ी संख्या में जाकर कभी-कभी असफल हो जाते हैं, छोटे और आपको ड्राइव के मुकाबले कम थ्रूपुट मिल जाएगा।
gc -ReadCount 256KB -Path $infile -Encoding Byte | ...
प्लस मैं Add-Content
पाया बेहतर और छोटे फ़ाइलों का एक बहुत कुछ के लिए फ़ाइल-दर-फ़ाइल जा रहा हो सकता है, क्योंकि पाइपिंग:
gc
साथ
कि -ReadCount
नहीं बस -Read
(PowerShell 5.0) के साथ होगा केवल एक मामूली मात्रा में डेटा (200 एमबी) मैंने पाया कि मेरा कंप्यूटर ओम, पावरशेल फ्रीजिंग और सीपीयू पर पूरा हो रहा है।
हालांकि Add-Content
बेतरतीब ढंग से गंतव्य फ़ाइल उपयोग में होने के बारे में एक त्रुटि के साथ कुछ सौ फ़ाइलों के लिए कई बार विफल रहता है, तो मैं थोड़ी देर के पाश और एक कोशिश पकड़ कहा:
# Empty the file first
sc -Path "$path\video.ts" -Value @() -Encoding Byte
$tsfiles | foreach {
while ($true) {
try { # I had -ReadCount 0 because the files are smaller than 256KB
gc -ReadCount 0 -Path "$path\$_" -Encoding Byte | `
Add-Content -Path "$path\video.ts" -Encoding Byte -ErrorAction Stop
break;
} catch {
}
}
}
का उपयोग करते हुए एक फ़ाइल धारा है अभी भी बहुत तेज है। आप [System.IO.File]::Open
के साथ एक बफर आकार निर्दिष्ट कर सकते हैं नहीं है, लेकिन आप new [System.IO.FileStream]
इसलिए की तरह साथ कर सकते हैं:
# $path = "C:\"
$ins = @("a.ts", "b.ts")
$outfile = "$path\out.mp4"
$out = New-Object -TypeName "System.IO.FileStream" -ArgumentList @(
$outfile,
[System.IO.FileMode]::Create,
[System.IO.FileAccess]::Write,
[System.IO.FileShare]::None,
256KB,
[System.IO.FileOptions]::None)
try {
foreach ($in in $ins) {
$fs = New-Object -TypeName "System.IO.FileStream" -ArgumentList @(
"$path\$in",
[System.IO.FileMode]::Open,
[System.IO.FileAccess]::Read,
[System.IO.FileShare]::Read,
256KB,
[System.IO.FileOptions]::SequentialScan)
try {
$fs.CopyTo($out)
} finally {
$fs.Dispose()
}
}
} finally {
$out.Dispose()
}
मैंने इसे अपनी उदाहरण फाइलों पर अभी चलाया और कमांड को शामिल करने के साथ कमांड 9 मिनट से 3 सेकंड लेने में चला गया। यह एक x25m ड्राइव पर है। अच्छा लगा। आप मेरी स्वीकृति प्राप्त करते हैं। – FkYkko
23 फाइलों पर फैले 4.4 जीबी आईएसओ में शामिल होने के लिए बस एक-लाइनर का इस्तेमाल किया। फ़ाइल ठीक से दोबारा इकट्ठा किया, और 1024 बाइट ब्लॉक का उपयोग कर अपने लैपटॉप पर 35 मिनट लग गए। –
मैं इस काम का अनुमान लगा रहा हूं क्योंकि पाइप स्कैन करने के लिए .NET ऑब्जेक्ट भेज रहा है? जब मैंने एक सी प्रोग्राम में बाइनरी डेटा पाइप करने की कोशिश की, तो मैंने देखा कि मुझे केवल प्रत्येक बाइट के पहले 7 बिट मिल गए हैं, क्योंकि "|" एन्कोडिंग का आह्वान किया गया था। – johnnycrash