Nie wierzę, że coś wewnątrz .NET, aby umożliwić kopiowanie fragmentu pliku bez buforowania go w pamięci. Jednak wydaje mi się, że i tak jest to nieefektywne, ponieważ musi otworzyć plik wejściowy i szukać wiele razy. Jeśli jesteś tylko dzielenie się plik, dlaczego nie otworzyć pliku wejściowego raz, a potem po prostu napisać coś takiego:
public static void CopySection(Stream input, string targetFile, int length)
{
byte[] buffer = new byte[8192];
using (Stream output = File.OpenWrite(targetFile))
{
int bytesRead = 1;
// This will finish silently if we couldn't read "length" bytes.
// An alternative would be to throw an exception
while (length > 0 && bytesRead > 0)
{
bytesRead = input.Read(buffer, 0, Math.Min(length, buffer.Length));
output.Write(buffer, 0, bytesRead);
length -= bytesRead;
}
}
}
Ma niewielką nieefektywność w tworzeniu bufora na każdym wywołaniu - może chcesz stworzyć bufor raz i przekazać, że do metody, a także:
public static void CopySection(Stream input, string targetFile,
int length, byte[] buffer)
{
using (Stream output = File.OpenWrite(targetFile))
{
int bytesRead = 1;
// This will finish silently if we couldn't read "length" bytes.
// An alternative would be to throw an exception
while (length > 0 && bytesRead > 0)
{
bytesRead = input.Read(buffer, 0, Math.Min(length, buffer.Length));
output.Write(buffer, 0, bytesRead);
length -= bytesRead;
}
}
}
Zauważ, że to zamyka również strumień wyjściowy (dzięki użyciu instrukcji), co oryginalny kod nie.
Ważne jest to, że będzie to bardziej efektywnie wykorzystywać buforowanie plików systemu operacyjnego, ponieważ ponownie używasz tego samego strumienia wejściowego zamiast ponownego otwierania pliku na początku, a następnie wyszukiwania.
myślę będzie to znacznie szybciej, ale oczywiście trzeba spróbować, aby zobaczyć ...
Zakłada sąsiadujących fragmentów, oczywiście. Jeśli chcesz pominąć bity pliku, możesz to zrobić spoza metody. Ponadto, jeśli piszesz bardzo małe pliki, możesz chcieć zoptymalizować dla tej sytuacji - najprostszym sposobem na to byłoby prawdopodobnie wprowadzenie strumienia wejściowego BufferedStream
.
File.OpenRead i File.OpenWrite 100000 będzie powolny porządku ... –
Czy podział pliku idealnie, czyli można odbudować duży plik przez prostu łącząc wszystkie małe pliki razem? Jeśli tak, to są oszczędności. Jeśli nie, zakresy małych plików pokrywają się? Czy są sortowane w kolejności przesunięcia? – jamie