Ladda ner en 16GB torrent via en surfplatta med 4GB ledigt utrymme

Ladda ner en 16GB torrent via en surfplatta med 4GB ledigt utrymme

Uppgift:

Det finns en PC utan internet, men det är möjligt att överföra filen via USB. Det finns en surfplatta med Internet från vilken den här filen kan överföras. Du kan ladda ner den nödvändiga torrenten på din surfplatta, men det finns inte tillräckligt med ledigt utrymme. Filen i torrenten är en och stor.

Väg till lösning:

Jag startade torrenten för att ladda ner. När det lediga utrymmet nästan var slut pausade jag nedladdningen. Jag kopplade surfplattan till datorn och flyttade filen från surfplattan till datorn. Jag pausade och till min förvåning skapades filen igen och torrenten fortsatte att ladda ner som om ingenting hade hänt.

På grund av det faktum att torrentklienten ställer in sparse-flaggan till filen där den skriver mottagna data, försöker systemet inte reservera 16 GB på en gång och ett fel kommer inte att uppstå när du försöker skriva till en fil över 4 GB.

Efter att ha upprepat proceduren fyra gånger fick jag fyra filer på min dator som innehåller olika delar av samma torrent. Nu återstår bara att sätta ihop dem. Proceduren är i grunden enkel. Du måste ersätta nollbyten med ett annat värde om det finns på en given position i en av de fyra filerna.

Det verkade för mig att ett så enkelt program borde finnas på Internet. Har ingen någonsin stött på ett sådant problem? Men jag insåg att jag inte ens vet vilka sökord jag ska söka efter. Därför skapade jag snabbt ett Lua-skript för denna uppgift och nu har jag optimerat det. Detta är vad jag vill dela med mig av.

Ladda ner torrent i delar

  1. börja ladda ner torrenten på den första enheten
  2. vänta tills ROM-minnet är fyllt
  3. pausa nedladdningen
  4. överför filen till den andra enheten och lägg till ett nummer i filnamnet
  5. vi återgår till den första punkten tills filen är helt nedladdad

Slå ihop delar till en fil

Efter att den sista delen har tagits emot är det nödvändigt att samla dem i en hel fil.

Uppgiften är enkel:

  1. Läser alla delar på en gång
  2. Om positionen i någon del inte är en nollbyte, så skriver vi den till utgången, annars skriver vi noll

Funktion merge_part accepterar en rad trådar streams_in varav läser en del av storlek buffer_length och returnerar resultatet av sammanslagna delar från olika trådar.

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 är lämplig för uppgiften eftersom den kommer att hitta bitar fyllda med nollor och leverera det som ges till den.

--]]
                out_part = out_part:gsub(" +", function(zero_string)

                    if #in_part < find_index then
                        return -- не на что менять
                    end
--[[

string.gsub förmedlar inte den position där matchningen hittades. Därför gör vi en parallell sökning efter tjänsten zero_string använder funktionen string.find. Det räcker med att hitta den första nollbyten.

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

--[[

Nu om i in_part det finns data för out_part kopiera dem.

--]]
                    if #in_part >= start_index then
                        local end_index = start_index + #zero_string - 1
--[[

Klipp från in_part del som motsvarar sekvensen av nollor.

--]]
                        local part = in_part:sub(start_index, end_index)

                        if (part:byte(1) ~= 0) or part:find("[^ ]") then
--[[

В part det finns data.

--]]
                            if #part == #zero_string then
                                return part
                            else
--[[

part visade sig vara mindre än en sekvens av nollor. Låt oss komplettera det med dem.

--]]
                                return part..zero_string:sub(1, end_index - #in_part)
                            end
                        end
                    end
                end)
            end
        end
    end
    return out_part
end

Slutsats

Således kunde vi ladda ner och montera den här filen på en PC. Efter sammanslagningen drog jag ut torrentfilen från surfplattan. Jag installerade en torrentklient på min PC och kollade filen med den.

Den senast nedladdade delen på surfplattan kan lämnas kvar på distributionen, men du måste aktivera omkontroll av delarna innan detta och avmarkera filen så att den inte laddas ner igen.

Begagnade:

  1. Flud torrent-klient på en surfplatta.
  2. Torrent-klient qBittorent på PC.
  3. Lua manus

Källa: will.com

Lägg en kommentar