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
börja ladda ner torrenten på den första enheten
vänta tills ROM-minnet är fyllt
pausa nedladdningen
överför filen till den andra enheten och lägg till ett nummer i filnamnet
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:
Läser alla delar på en gång
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.
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.