Preuzimanje torrenta od 16 GB putem tableta sa 4 GB slobodnog prostora
Zadatak:
Postoji PC bez interneta, ali je moguće prenijeti fajl preko USB-a. Postoji tablet sa internetom sa kojeg se ovaj fajl može prenijeti. Možete preuzeti potreban torrent na svoj tablet, ali nema dovoljno slobodnog prostora. Fajl u torentu je jedan i veliki.
Put do rješenja:
Pokrenuo sam torrent za preuzimanje. Kada je slobodan prostor skoro nestao, pauzirao sam preuzimanje. Povezao sam tablet sa računarom i premestio fajl sa tableta na računar. Zastao sam i na moje iznenađenje fajl je ponovo kreiran, a torrent je nastavio da se preuzima kao da se ništa nije dogodilo.
Zbog činjenice da torrent klijent postavlja oznaku sparse na fajl u koji upisuje primljene podatke, sistem ne pokušava da rezerviše 16GB odjednom i neće doći do greške kada pokušate da upišete u fajl veći od 4GB.
Nakon što sam četiri puta ponovio proceduru, dobio sam četiri fajla na svom računaru koji sadrže različite delove istog torrenta. Sada ostaje samo da ih spojite. Procedura je u suštini jednostavna. Morate zamijeniti nulte bajtove drugom vrijednošću ako postoji na datoj poziciji u jednoj od četiri datoteke.
Činilo mi se da bi tako jednostavan program trebao biti na internetu. Zar se niko nikada nije susreo sa takvim problemom? Ali shvatio sam da čak ni ne znam koje ključne riječi da tražim. Stoga sam brzo kreirao Lua skriptu za ovaj zadatak i sada sam je optimizovao. Ovo je ono što želim podijeliti.
Preuzimanje torrenta u dijelovima
počnite da preuzimate torrent na prvom uređaju
sačekajte da se ROM popuni
pauzirajte preuzimanje
prenesite datoteku na drugi uređaj i dodajte broj imenu datoteke
vraćamo se na prvu tačku dok se datoteka ne preuzme u potpunosti
Spajanje delova u jedan fajl
Nakon što je zadnji dio primljen, potrebno ih je sakupiti u jedan cijeli fajl.
Zadatak je jednostavan:
Čitanje svih dijelova odjednom
Ako u nekom dijelu pozicija nije nula bajt, onda je upisujemo na izlaz, u suprotnom pišemo nulu
funkcija merge_part prihvata niz niti streams_in od kojih glasi dio veličine buffer_length i vraća rezultat spajanja dijelova iz različitih niti.
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
--[[
funkcija string.gsub je pogodan za zadatak jer će pronaći komade ispunjene nulama i isporučiti ono što mu je dato.
--]]
out_part = out_part:gsub(" +", function(zero_string)
if #in_part < find_index then
return -- не на что менять
end
--[[
string.gsub ne prenosi poziciju na kojoj je pronađena utakmica. Stoga radimo paralelnu pretragu pozicije zero_string koristeći funkciju string.find. Dovoljno je pronaći prvi nulti bajt.
Sada ako uđete in_part postoje podaci za out_part kopirajte ih.
--]]
if #in_part >= start_index then
local end_index = start_index + #zero_string - 1
--[[
Cut from in_part dio koji odgovara nizu nula.
--]]
local part = in_part:sub(start_index, end_index)
if (part:byte(1) ~= 0) or part:find("[^ ]") then
--[[
В part postoje podaci.
--]]
if #part == #zero_string then
return part
else
--[[
part pokazalo se da je manji od niza nula. Hajde da to dopunimo njima.
--]]
return part..zero_string:sub(1, end_index - #in_part)
end
end
end
end)
end
end
end
return out_part
end
zaključak
Tako smo uspjeli preuzeti i sastaviti ovu datoteku na PC. Nakon spajanja, izvukao sam torrent fajl sa tableta. Instalirao sam torrent klijent na svoj PC i provjerio fajl sa njim.
Zadnji preuzeti dio na tabletu možete ostaviti na distribuciji, ali prije toga morate omogućiti ponovnu provjeru dijelova i poništiti oznaku datoteke kako se ne bi ponovo preuzimala.