ProHoster > Blog > Verwaltung > Herunterladen eines 16-GB-Torrents über ein Tablet mit 4 GB freiem Speicherplatz
Herunterladen eines 16-GB-Torrents über ein Tablet mit 4 GB freiem Speicherplatz
Problem:
Es gibt einen PC ohne Internet, aber es ist möglich, die Datei über USB zu übertragen. Es gibt ein Tablet mit Internet, von dem aus diese Datei übertragen werden kann. Sie können den erforderlichen Torrent auf Ihr Tablet herunterladen, es ist jedoch nicht genügend freier Speicherplatz vorhanden. Die Datei im Torrent ist eins und groß.
Weg zur Lösung:
Ich habe den Torrent zum Herunterladen gestartet. Als der freie Speicherplatz fast aufgebraucht war, habe ich den Download angehalten. Ich habe das Tablet an den PC angeschlossen und die Datei vom Tablet auf den PC verschoben. Ich hielt inne und zu meiner Überraschung wurde die Datei erneut erstellt und der Torrent wurde weiter heruntergeladen, als wäre nichts passiert.
Aufgrund der Tatsache, dass der Torrent-Client das Sparse-Flag auf die Datei setzt, in die er die empfangenen Daten schreibt, versucht das System nicht, 16 GB auf einmal zu reservieren, und es tritt kein Fehler auf, wenn versucht wird, in eine Datei mit mehr als 4 GB zu schreiben.
Nachdem ich den Vorgang viermal wiederholt hatte, erhielt ich auf meinem PC vier Dateien, die verschiedene Teile desselben Torrents enthielten. Jetzt müssen sie nur noch zusammengesetzt werden. Das Verfahren ist grundsätzlich einfach. Sie müssen die Nullbytes durch einen anderen Wert ersetzen, wenn dieser an einer bestimmten Position in einer der vier Dateien vorhanden ist.
Es schien mir, dass ein so einfaches Programm im Internet verfügbar sein sollte. Ist noch nie jemand auf ein solches Problem gestoßen? Aber mir wurde klar, dass ich nicht einmal weiß, nach welchen Schlüsselwörtern ich suchen sollte. Deshalb habe ich schnell ein Lua-Skript für diese Aufgabe erstellt und es nun optimiert. Das ist es, was ich teilen möchte.
Den Torrent in Teilen herunterladen
Beginnen Sie mit dem Herunterladen des Torrents auf dem ersten Gerät
Warten Sie, bis das ROM gefüllt ist
Unterbrechen Sie den Download
Übertragen Sie die Datei auf das zweite Gerät und fügen Sie dem Dateinamen eine Nummer hinzu
Wir kehren zum ersten Punkt zurück, bis die Datei vollständig heruntergeladen ist
Teile in einer Datei zusammenführen
Nachdem der letzte Teil empfangen wurde, ist es notwendig, ihn in einer ganzen Datei zusammenzufassen.
Die Aufgabe ist einfach:
Alle Teile auf einmal lesen
Wenn die Position in einem Teil kein Null-Byte ist, schreiben wir es in den Ausgang, andernfalls schreiben wir Null
Funktion merge_part akzeptiert ein Array von Threads streams_in davon liest sich ein Teil der Größe buffer_length und gibt das Ergebnis der Zusammenführung von Teilen aus verschiedenen Threads zurück.
function merge_part(streams_in, buffer_length)
local out_part
for _, stream in ipairs(streams_in) do
local in_part = stream:read(buffer_length)
if not out_part then
out_part = in_part -- просто копируем часть из первого файла
elseif in_part and #in_part > 0 then
if #out_part < #in_part then
out_part, in_part = in_part, out_part
end
if out_part ~= in_part -- данные различаются
and in_part:find("[^ ]") -- есть данные в in_part
and out_part:find(" ", 1, true) -- есть пустые места в out_part
then
local find_index = 1
--[[
Funktion string.gsub ist für die Aufgabe geeignet, da es mit Nullen gefüllte Stücke findet und liefert, was ihm gegeben wird.
--]]
out_part = out_part:gsub(" +", function(zero_string)
if #in_part < find_index then
return -- не на что менять
end
--[[
string.gsub gibt nicht die Position an, an der die Übereinstimmung gefunden wurde. Daher führen wir eine parallele Suche nach der Position durch zero_string mit der Funktion string.find. Es reicht aus, das erste Null-Byte zu finden.
Nun, wenn in in_part Es gibt Daten für out_part kopiere sie.
--]]
if #in_part >= start_index then
local end_index = start_index + #zero_string - 1
--[[
Ausschneiden in_part Teil, der der Folge von Nullen entspricht.
--]]
local part = in_part:sub(start_index, end_index)
if (part:byte(1) ~= 0) or part:find("[^ ]") then
--[[
В part Es gibt Daten.
--]]
if #part == #zero_string then
return part
else
--[[
part Es stellte sich heraus, dass es kleiner als eine Folge von Nullen war. Ergänzen wir es damit.
--]]
return part..zero_string:sub(1, end_index - #in_part)
end
end
end
end)
end
end
end
return out_part
end
Abschluss
Somit konnten wir diese Datei herunterladen und auf einem PC zusammenstellen. Nach der Fusion habe ich die Torrent-Datei vom Tablet gezogen. Ich habe einen Torrent-Client auf meinem PC installiert und die Datei damit überprüft.
Der zuletzt heruntergeladene Teil auf dem Tablet kann in der Distribution belassen werden, Sie müssen jedoch vorher die erneute Überprüfung der Teile aktivieren und die Datei deaktivieren, damit sie nicht erneut heruntergeladen wird.