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

  1. Beginnen Sie mit dem Herunterladen des Torrents auf dem ersten Gerät
  2. Warten Sie, bis das ROM gefüllt ist
  3. Unterbrechen Sie den Download
  4. Übertragen Sie die Datei auf das zweite Gerät und fügen Sie dem Dateinamen eine Nummer hinzu
  5. 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:

  1. Alle Teile auf einmal lesen
  2. 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.

--]]
                    local start_index = out_part:find(" ", find_index, true)
                    find_index = start_index + #zero_string

--[[

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.

Gebraucht:

  1. Flud Torrent-Client auf einem Tablet.
  2. Torrent-Client qBittorent auf dem PC.
  3. Lua-Skript

Source: habr.com

Kommentar hinzufügen