16 GB torrenta lejupielāde, izmantojot planšetdatoru ar 4 GB brīvas vietas
Uzdevums:
Ir dators bez interneta, bet ir iespēja pārsūtīt failu caur USB. Ir planšetdators ar internetu, no kura var pārsūtīt šo failu. Planšetdatorā varat lejupielādēt nepieciešamo torrentu, taču nav pietiekami daudz brīvas vietas. Torrentā esošais fails ir viens un liels.
Ceļš uz risinājumu:
Es sāku lejupielādēt torrentu. Kad brīvās vietas gandrīz vairs nebija, es apturēju lejupielādi. Es savienoju planšetdatoru ar datoru un pārvietoju failu no planšetdatora uz datoru. Es apstājos, un man par pārsteigumu fails tika izveidots vēlreiz, un torrents turpināja lejupielādi, it kā nekas nebūtu noticis.
Sakarā ar to, ka torrent klients failam, kurā ieraksta saņemtos datus, iestata retu karogu, sistēma nemēģina rezervēt 16 GB uzreiz un, mēģinot rakstīt failā, kas pārsniedz 4 GB, kļūda neradīsies.
Atkārtojot procedūru četras reizes, es savā datorā saņēmu četrus failus, kas satur dažādas viena un tā paša torrenta daļas. Tagad atliek tikai tos salikt kopā. Procedūra būtībā ir vienkārša. Nulles baiti ir jāaizstāj ar citu vērtību, ja tā atrodas noteiktā pozīcijā vienā no četriem failiem.
Man šķita, ka tik vienkāršai programmai vajadzētu būt internetā. Vai neviens ar šādu problēmu nav saskāries? Bet es sapratu, ka pat nezinu, pēc kādiem atslēgvārdiem to meklēt. Tāpēc es ātri izveidoju Lua skriptu šim uzdevumam un tagad esmu to optimizējis. Tas ir tas, ko es vēlos dalīties.
Torrenta lejupielāde pa daļām
sāciet lejupielādēt torrentu pirmajā ierīcē
pagaidiet, līdz ROM ir pilna
apturēt lejupielādi
pārsūtiet failu uz otru ierīci un pievienojiet faila nosaukumam numuru
mēs atgriežamies pie pirmā punkta, līdz fails ir pilnībā lejupielādēts
Daļu apvienošana vienā failā
Pēc pēdējās daļas saņemšanas tās jāsavāc vienā veselā failā.
Uzdevums ir vienkāršs:
Visu daļu lasīšana vienlaikus
Ja kādā daļā pozīcija nav nulles baits, tad ierakstām to izvadā, pretējā gadījumā rakstām nulli
Funkcija merge_part pieņem virkni pavedienu streams_in no kuriem nolasa lieluma daļu buffer_length un atgriež dažādu pavedienu daļu sapludināšanas rezultātu.
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 ir piemērots uzdevumam, jo tas atradīs gabalus, kas piepildīti ar nullēm, un nogādās to, kas tam ir dots.
--]]
out_part = out_part:gsub(" +", function(zero_string)
if #in_part < find_index then
return -- не на что менять
end
--[[
string.gsub nenorāda pozīciju, kurā tika atrasta atbilstība. Tāpēc veicam paralēlu pozīcijas meklēšanu zero_string izmantojot funkciju string.find. Pietiek, lai atrastu pirmo nulles baitu.
Tagad, ja iekšā in_part ir dati par out_part kopēt tos.
--]]
if #in_part >= start_index then
local end_index = start_index + #zero_string - 1
--[[
Izgriezt no in_part daļu, kas atbilst nulles secībai.
--]]
local part = in_part:sub(start_index, end_index)
if (part:byte(1) ~= 0) or part:find("[^ ]") then
--[[
В part ir dati.
--]]
if #part == #zero_string then
return part
else
--[[
part izrādījās mazāks par nulles secību. Papildināsim to ar tiem.
--]]
return part..zero_string:sub(1, end_index - #in_part)
end
end
end
end)
end
end
end
return out_part
end
Secinājums
Tādējādi mēs varējām lejupielādēt un apkopot šo failu datorā. Pēc apvienošanas es izvilku torrent failu no planšetdatora. Es savā datorā instalēju torrent klientu un pārbaudīju failu ar to.
Pēdējo planšetdatorā lejupielādēto daļu var atstāt izplatīšanā, taču pirms šīs daļas ir jāiespējo atkārtota daļu pārbaude un jānoņem atzīme failam, lai tas vairs netiktu lejupielādēts.