ProHoster > blog > administratie > Een torrent van 16 GB downloaden via een tablet met 4 GB vrije ruimte
Een torrent van 16 GB downloaden via een tablet met 4 GB vrije ruimte
doelstelling:
Er is een pc zonder internet, maar het is mogelijk om het bestand via USB over te zetten. Er is een tablet met internet waarvandaan dit bestand kan worden overgedragen. Je kunt de benodigde torrent downloaden op je tablet, maar er is niet genoeg vrije ruimte. Het bestand in de torrent is één en groot.
Pad naar oplossing:
Ik startte de torrent om te downloaden. Toen de vrije ruimte bijna verdwenen was, heb ik de download gepauzeerd. Ik heb de tablet op de pc aangesloten en het bestand van de tablet naar de pc verplaatst. Ik pauzeerde even en tot mijn verbazing werd het bestand opnieuw aangemaakt en ging de torrent verder met downloaden alsof er niets was gebeurd.
Vanwege het feit dat de torrent-client de sparse-vlag instelt op het bestand waarin het de ontvangen gegevens schrijft, probeert het systeem niet in één keer 16 GB te reserveren en zal er geen fout optreden bij het schrijven naar een bestand groter dan 4 GB.
Nadat ik de procedure vier keer had herhaald, ontving ik vier bestanden op mijn pc met verschillende delen van dezelfde torrent. Nu rest ons alleen nog om ze samen te voegen. De procedure is in wezen eenvoudig. U moet de nulbytes vervangen door een andere waarde als deze op een bepaalde positie in een van de vier bestanden voorkomt.
Het leek mij dat zo'n eenvoudig programma op internet zou moeten staan. Heeft niemand ooit zo'n probleem ondervonden? Maar ik realiseerde me dat ik niet eens weet op welke trefwoorden ik moet zoeken. Daarom heb ik snel een Lua-script voor deze taak gemaakt en nu heb ik het geoptimaliseerd. Dit is wat ik wil delen.
Download de torrent in delen
begin met het downloaden van de torrent op het eerste apparaat
wacht tot het ROM gevuld is
pauzeer het downloaden
breng het bestand over naar het tweede apparaat en voeg een nummer toe aan de bestandsnaam
we keren terug naar het eerste punt totdat het bestand volledig is gedownload
Onderdelen samenvoegen tot één bestand
Nadat het laatste deel is ontvangen, is het noodzakelijk om ze in één geheel bestand te verzamelen.
De taak is eenvoudig:
Alle delen in één keer lezen
Als de positie op een bepaald moment geen nulbyte is, schrijven we deze naar de uitvoer, anders schrijven we nul
Functie merge_part accepteert een reeks threads streams_in waarvan een gedeelte van de grootte wordt gelezen buffer_length en retourneert het resultaat van het samenvoegen van delen uit verschillende threads.
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
--[[
Functie string.gsub is geschikt voor de taak omdat het stukken met nullen zal vinden en zal afleveren wat hem wordt gegeven.
--]]
out_part = out_part:gsub(" +", function(zero_string)
if #in_part < find_index then
return -- не на что менять
end
--[[
string.gsub geeft niet de positie weer waarop de match werd gevonden. Daarom zoeken we parallel naar de positie zero_string de functie gebruiken: string.find. Het is voldoende om de eerste nulbyte te vinden.
Als nu binnen in_part Er zijn gegevens voor out_part kopieer ze.
--]]
if #in_part >= start_index then
local end_index = start_index + #zero_string - 1
--[[
Knip uit in_part deel dat overeenkomt met de reeks nullen.
--]]
local part = in_part:sub(start_index, end_index)
if (part:byte(1) ~= 0) or part:find("[^ ]") then
--[[
В part er zijn gegevens.
--]]
if #part == #zero_string then
return part
else
--[[
part bleek minder te zijn dan een reeks nullen. Laten we het met hen aanvullen.
--]]
return part..zero_string:sub(1, end_index - #in_part)
end
end
end
end)
end
end
end
return out_part
end
Conclusie
Zo konden we dit bestand downloaden en op een pc samenstellen. Na de fusie haalde ik het torrent-bestand van de tablet. Ik heb een torrent-client op mijn pc geïnstalleerd en daarmee het bestand gecontroleerd.
Het laatst gedownloade onderdeel op de tablet kan op de distributie blijven staan, maar u moet het opnieuw controleren van de onderdelen daarvoor inschakelen en het bestand uitschakelen zodat het niet opnieuw wordt gedownload.