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

  1. kezdje el letölteni a torrentet az első eszközön
  2. várja meg, amíg a ROM megtelik
  3. szüneteltesse a letöltést
  4. vigye át a fájlt a második eszközre, és adjon hozzá egy számot a fájlnévhez
  5. 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ű:

  1. Az összes rész egyben olvasása
  2. 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.

--]]
                    local start_index = out_part:find(" ", find_index, true)
                    find_index = start_index + #zero_string

--[[

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.

Használt:

  1. Flud torrent kliens táblagépen.
  2. Torrent kliens qBittorent PC-n.
  3. Lua forgatókönyv

Forrás: will.com

Hozzászólás