ProHoster > Blog > uprava > Preuzimanje torrenta od 16 GB putem tableta s 4 GB slobodnog prostora
Preuzimanje torrenta od 16 GB putem tableta s 4 GB slobodnog prostora
cilj:
Postoji računalo bez interneta, ali je moguće prenijeti datoteku putem USB-a. Postoji tablet s internetom s kojeg se može prenijeti ova datoteka. Možete preuzeti traženi torrent na svom tabletu, ali nema dovoljno slobodnog prostora. Datoteka u torentu je jedna i velika.
Put do rješenja:
Pokrenuo sam torrent za preuzimanje. Kad je gotovo nestalo slobodnog prostora, pauzirao sam preuzimanje. Spojio sam tablet na računalo i premjestio datoteku s tableta na računalo. Zastao sam i na moje iznenađenje datoteka se ponovno stvorila, a torrent se nastavio preuzimati kao da se ništa nije dogodilo.
Zbog činjenice da torrent klijent postavlja sparse oznaku na datoteku u koju upisuje primljene podatke, sustav ne pokušava rezervirati 16 GB odjednom i neće se pojaviti pogreška pri pokušaju pisanja u datoteku veću od 4 GB.
Nakon što sam postupak ponovio četiri puta, dobio sam četiri datoteke na računalu koje sadrže različite dijelove istog torrenta. Sada samo preostaje da ih sastavite. Postupak je u biti jednostavan. Morate zamijeniti nulte bajtove drugom vrijednošću ako postoji na danom mjestu u jednoj od četiri datoteke.
Činilo mi se da bi takav jednostavan program trebao biti na Internetu. Zar se nitko nikada nije susreo s takvim problemom? Ali shvatio sam da ne znam ni koje ključne riječi da tražim. Stoga sam brzo izradio Lua skriptu za ovaj zadatak i sada sam je optimizirao. Ovo je ono što želim podijeliti.
Skidanje torrenta u dijelovima
počnite preuzimati torrent na prvom uređaju
pričekajte dok se ROM ne napuni
pauzirajte preuzimanje
prenesite datoteku na drugi uređaj i dodajte broj nazivu datoteke
vraćamo se na prvu točku dok se datoteka u potpunosti ne preuzme
Spajanje dijelova u jednu datoteku
Nakon što je zadnji dio primljen, potrebno ih je prikupiti u jednu cijelu datoteku.
Zadatak je jednostavan:
Čitanje svih dijelova odjednom
Ako u nekom dijelu pozicija nije nulti bajt, tada to ispisujemo na izlazu, u suprotnom ispisujemo nulu
Funkcija merge_part prihvaća 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 prikladan je za zadatak jer će pronaći dijelove ispunjene nulama i isporučiti ono što mu se da.
--]]
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đeno podudaranje. Stoga paralelno tražimo poziciju zero_string koristeći funkciju string.find. Dovoljno je pronaći prvi nulti bajt.
Sada ako u in_part postoje podaci za out_part kopirajte ih.
--]]
if #in_part >= start_index then
local end_index = start_index + #zero_string - 1
--[[
Izrezano iz 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 ima podataka.
--]]
if #part == #zero_string then
return part
else
--[[
part ispostavilo se da je manji od niza nula. Dopunimo ga 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 mogli preuzeti i sastaviti ovu datoteku na računalu. Nakon spajanja, izvukao sam torrent datoteku s tableta. Instalirao sam torrent klijent na svoje računalo i pomoću njega provjerio datoteku.
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 ponovno preuzimala.