ProHoster > Blog > Adminisztráció > 16 GB-os torrent letöltése 4 GB szabad tárhellyel rendelkező táblagépen keresztül
16 GB-os torrent letöltése 4 GB szabad tárhellyel rendelkező táblagépen keresztül
Feladat:
Van egy számítógép internet nélkül, de lehetséges a fájl átvitele USB-n keresztül. Van egy táblagép internettel, amelyről ezt a fájlt át lehet vinni. A szükséges torrentet letöltheti táblagépére, de nincs elég szabad hely. A torrent fájlja egy és nagy.
A megoldáshoz vezető út:
Elindítottam a torrent letöltését. Amikor a szabad hely majdnem elfogyott, leállítottam a letöltést. Csatlakoztattam a táblagépet a számítógéphez, és áthelyeztem a fájlt a táblagépről a számítógépre. Megálltam, és meglepetésemre a fájl újra létrejött, és a torrent letöltése tovább folytatódott, mintha mi sem történt volna.
Tekintettel arra, hogy a torrent kliens arra a fájlra állítja be a ritka jelzőt, amelybe a fogadott adatokat írja, a rendszer nem próbál meg egyszerre 16 GB-ot lefoglalni, és nem történik hiba, amikor 4 GB-nál nagyobb fájlba próbál írni.
Az eljárás négyszeri megismétlése után négy fájl érkezett a számítógépemre, amelyek ugyanannak a torrentnek a különböző részeit tartalmazták. Most már csak össze kell rakni őket. Az eljárás lényegében egyszerű. A nulla bájtokat le kell cserélni egy másik értékre, ha az a négy fájl valamelyikének adott pozíciójában létezik.
Számomra úgy tűnt, hogy egy ilyen egyszerű programnak az interneten kell lennie. Senki nem találkozott még ilyen problémával? De rájöttem, hogy azt sem tudom, milyen kulcsszavakra keressek rá. Ezért gyorsan létrehoztam egy Lua szkriptet ehhez a feladathoz, és most optimalizáltam. Ezt szeretném megosztani.
A torrent letöltése részletekben
kezdje el letölteni a torrentet az első eszközön
várja meg, amíg a ROM megtelik
szüneteltesse a letöltést
vigye át a fájlt a második eszközre, és adjon hozzá egy számot a fájlnévhez
visszatérünk az első ponthoz, amíg a fájl teljesen le nem töltődik
A részek egyesítése egy fájlba
Miután az utolsó rész megérkezett, össze kell gyűjteni őket egy teljes fájlba.
A feladat egyszerű:
Az összes rész egyben olvasása
Ha egy helyen a pozíció nem nulla bájt, akkor azt írjuk a kimenetre, ellenkező esetben nullát írunk
Funkció merge_part szálak tömbjét fogadja el streams_in amelyből egy méretrész olvasható buffer_length és a különböző szálakból származó részek egyesítésének eredményét adja vissza.
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
--[[
Funkció string.gsub alkalmas a feladatra, mert megkeresi a nullákkal töltött darabokat, és leadja azt, ami adott.
--]]
out_part = out_part:gsub(" +", function(zero_string)
if #in_part < find_index then
return -- не на что менять
end
--[[
string.gsub nem közvetíti azt a pozíciót, ahol az egyezést megtalálták. Ezért párhuzamosan keresünk a pozícióra zero_string funkció használatával string.find. Elég az első nulla bájtot megtalálni.
Most ha bent in_part számára van adat out_part másolja le őket.
--]]
if #in_part >= start_index then
local end_index = start_index + #zero_string - 1
--[[
Vágásból in_part a nullák sorozatának megfelelő rész.
--]]
local part = in_part:sub(start_index, end_index)
if (part:byte(1) ~= 0) or part:find("[^ ]") then
--[[
В part adat van.
--]]
if #part == #zero_string then
return part
else
--[[
part kisebbnek bizonyult, mint egy nullák sorozata. Egészítsük ki velük.
--]]
return part..zero_string:sub(1, end_index - #in_part)
end
end
end
end)
end
end
end
return out_part
end
Következtetés
Így ezt a fájlt le tudtuk tölteni és PC-n összeállítani. Az összevonás után kihúztam a torrent fájlt a tabletből. Telepítettem egy torrent klienst a számítógépemre, és megnéztem vele a fájlt.
A táblagépen az utoljára letöltött részt meg lehet hagyni a disztribúción, de előtte engedélyezni kell a részek újraellenőrzését, és törölni kell a fájl bejelölését, hogy ne töltődjön le újra.