Laai 'n 16GB-torrent af via 'n tablet met 4GB vrye spasie
'N Taak:
Daar is 'n rekenaar sonder die internet, maar dit is moontlik om die lêer via USB oor te dra. Daar is 'n tablet met die internet vanwaar hierdie lêer oorgedra kan word. Jy kan die vereiste torrent op jou tablet aflaai, maar daar is nie genoeg vrye spasie nie. Die lêer in die torrent is een en groot.
Pad na oplossing:
Ek het die torrent begin om af te laai. Toe die vrye spasie amper weg was, het ek die aflaai onderbreek. Ek het die tablet aan die rekenaar gekoppel en die lêer van die tablet na die rekenaar geskuif. Ek het stilgebly en tot my verbasing is die lêer weer geskep en die torrent het voortgegaan om af te laai asof niks gebeur het nie.
As gevolg van die feit dat die torrent-kliënt die yl vlag op die lêer stel waarin dit die ontvangde data skryf, probeer die stelsel nie 16GB op een slag reserveer nie en 'n fout sal nie voorkom wanneer daar na 'n lêer verder as 4GB probeer word nie.
Nadat ek die prosedure vier keer herhaal het, het ek vier lêers op my rekenaar ontvang wat verskillende dele van dieselfde torrent bevat. Al wat nou oorbly is om hulle bymekaar te sit. Die prosedure is in wese eenvoudig. Jy moet die nulgrepe met 'n ander waarde vervang as dit op 'n gegewe posisie in een van die vier lêers bestaan.
Dit het vir my gelyk asof so 'n eenvoudige program op die internet moet wees. Het niemand al ooit so 'n probleem teëgekom nie? Maar ek het besef dat ek nie eers weet watter sleutelwoorde om daarvoor te soek nie. Daarom het ek vinnig 'n Lua-skrif vir hierdie taak geskep en nou het ek dit geoptimaliseer. Dit is wat ek wil deel.
Laai die torrent in dele af
begin om die torrent op die eerste toestel af te laai
wag totdat die ROM gevul is
onderbreek die aflaai
dra die lêer oor na die tweede toestel en voeg 'n nommer by die lêernaam
ons keer terug na die eerste punt totdat die lêer heeltemal afgelaai is
Voeg dele saam in een lêer
Nadat die laaste deel ontvang is, is dit nodig om dit in een hele lêer te versamel.
Die taak is eenvoudig:
Lees alle dele gelyktydig
As die posisie in een of ander deel nie 'n nulgreep is nie, dan skryf ons dit na die uitvoer, anders skryf ons nul
Funksie merge_part aanvaar 'n verskeidenheid drade streams_in waarvan 'n gedeelte van grootte lees buffer_length en gee die resultaat van die samevoeging van dele van verskillende drade terug.
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
--[[
Funksie string.gsub is geskik vir die taak omdat dit stukke gevul met nulle sal vind en lewer wat daaraan gegee word.
--]]
out_part = out_part:gsub(" +", function(zero_string)
if #in_part < find_index then
return -- не на что менять
end
--[[
string.gsub gee nie die posisie oor waar die wedstryd gevind is nie. Daarom doen ons 'n parallelle soektog na die posisie zero_string die funksie te gebruik string.find. Dit is genoeg om die eerste nulgreep te vind.
Nou as in in_part daar is data vir out_part kopieer hulle.
--]]
if #in_part >= start_index then
local end_index = start_index + #zero_string - 1
--[[
Sny uit in_part deel wat ooreenstem met die volgorde van nulle.
--]]
local part = in_part:sub(start_index, end_index)
if (part:byte(1) ~= 0) or part:find("[^ ]") then
--[[
В part daar is data.
--]]
if #part == #zero_string then
return part
else
--[[
part blyk minder as 'n reeks nulle te wees. Kom ons vul dit aan met hulle.
--]]
return part..zero_string:sub(1, end_index - #in_part)
end
end
end
end)
end
end
end
return out_part
end
Gevolgtrekking
Ons kon dus hierdie lêer op 'n rekenaar aflaai en saamstel. Ná die samesmelting het ek die torrent-lêer van die tablet af gehaal. Ek het 'n torrent-kliënt op my rekenaar geïnstalleer en die lêer daarmee nagegaan.
Die laaste afgelaaide deel op die tablet kan op die verspreiding gelaat word, maar jy moet die herkontrolering van die dele voor dit aktiveer en die lêer ontmerk sodat dit nie weer aflaai nie.