Laste ned en 16 GB torrent via et nettbrett med 4 GB ledig plass
Mål:
Det finnes en PC uten Internett, men det er mulig å overføre filen via USB. Det er et nettbrett med Internett som denne filen kan overføres fra. Du kan laste ned den nødvendige torrenten på nettbrettet ditt, men det er ikke nok ledig plass. Filen i torrenten er én og stor.
Vei til løsning:
Jeg startet torrenten for å laste ned. Da den ledige plassen nesten var borte, satte jeg nedlastingen på pause. Jeg koblet nettbrettet til PC-en og flyttet filen fra nettbrettet til PC-en. Jeg stoppet og til min overraskelse ble filen opprettet igjen og torrenten fortsatte å laste ned som om ingenting hadde skjedd.
På grunn av det faktum at torrentklienten setter sparse-flagget til filen der den skriver de mottatte dataene, prøver ikke systemet å reservere 16 GB på en gang, og det vil ikke oppstå en feil når du prøver å skrive til en fil over 4 GB.
Etter å ha gjentatt prosedyren fire ganger, mottok jeg fire filer på PC-en min som inneholder forskjellige deler av samme torrent. Nå gjenstår det bare å sette dem sammen. Prosedyren er i hovedsak enkel. Du må erstatte nullbytene med en annen verdi hvis den finnes på en gitt posisjon i en av de fire filene.
Det virket for meg at et så enkelt program burde være på Internett. Har ingen noen gang vært borti et slikt problem? Men jeg innså at jeg ikke engang vet hvilke søkeord jeg skal søke etter det. Derfor laget jeg raskt et Lua-skript for denne oppgaven og nå har jeg optimalisert det. Dette er hva jeg vil dele.
Laste ned torrent i deler
begynn å laste ned torrenten på den første enheten
vent til ROM-en er fylt
pause nedlastingen
overføre filen til den andre enheten og legg til et nummer i filnavnet
vi går tilbake til det første punktet til filen er lastet ned fullstendig
Slå sammen deler til én fil
Etter at den siste delen er mottatt, er det nødvendig å samle dem i en hel fil.
Oppgaven er enkel:
Leser alle deler på en gang
Hvis posisjonen på en eller annen måte ikke er en nullbyte, skriver vi den til utgangen, ellers skriver vi null
Funksjon merge_part godtar en rekke tråder streams_in som leser en del av størrelsen buffer_length og returnerer resultatet av sammenslåing av deler fra forskjellige tråder.
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
--[[
Funksjon string.gsub passer for oppgaven fordi den vil finne brikker fylt med nuller og levere det som er gitt til den.
--]]
out_part = out_part:gsub(" +", function(zero_string)
if #in_part < find_index then
return -- не на что менять
end
--[[
string.gsub formidler ikke posisjonen der kampen ble funnet. Derfor gjør vi et parallelt søk etter stillingen zero_string ved å bruke funksjonen string.find. Det er nok å finne den første nullbyten.
Nå hvis i in_part det finnes data for out_part kopiere dem.
--]]
if #in_part >= start_index then
local end_index = start_index + #zero_string - 1
--[[
Klipp fra in_part del som tilsvarer sekvensen av nuller.
--]]
local part = in_part:sub(start_index, end_index)
if (part:byte(1) ~= 0) or part:find("[^ ]") then
--[[
В part det er data.
--]]
if #part == #zero_string then
return part
else
--[[
part viste seg å være mindre enn en sekvens med nuller. La oss supplere det med dem.
--]]
return part..zero_string:sub(1, end_index - #in_part)
end
end
end
end)
end
end
end
return out_part
end
Konklusjon
Dermed var vi i stand til å laste ned og sette sammen denne filen på en PC. Etter sammenslåingen trakk jeg ut torrentfilen fra nettbrettet. Jeg installerte en torrent-klient på PC-en min og sjekket filen med den.
Den sist nedlastede delen på nettbrettet kan stå på distribusjonen, men du må aktivere re-sjekking av delene før dette og fjerne merket for filen slik at den ikke lastes ned igjen.