Baixant un torrent de 16 GB mitjançant una tauleta amb 4 GB d'espai lliure

Baixant un torrent de 16 GB mitjançant una tauleta amb 4 GB d'espai lliure

Una tasca:

Hi ha un ordinador sense Internet, però és possible transferir el fitxer mitjançant USB. Hi ha una tauleta amb Internet des de la qual es pot transferir aquest fitxer. Podeu descarregar el torrent necessari a la vostra tauleta, però no hi ha prou espai lliure. El fitxer del torrent és un i gran.

Camí a la solució:

Vaig iniciar el torrent per descarregar. Quan l'espai lliure gairebé havia desaparegut, vaig aturar la descàrrega. Vaig connectar la tauleta a l'ordinador i vaig moure el fitxer de la tauleta a l'ordinador. Vaig fer una pausa i, per a la meva sorpresa, el fitxer es va tornar a crear i el torrent va continuar baixant com si no hagués passat res.

A causa del fet que el client torrent estableix la bandera escassa al fitxer en què escriu les dades rebudes, el sistema no intenta reservar 16 GB alhora i no es produirà cap error en intentar escriure en un fitxer més enllà de 4 GB.

Després de repetir el procediment quatre vegades, vaig rebre quatre fitxers al meu PC que contenien diferents parts del mateix torrent. Ara només queda unir-los. El procediment és essencialment senzill. Heu de substituir els zero bytes per un altre valor si existeix en una posició determinada en un dels quatre fitxers.

Em va semblar que un programa tan senzill hauria d'estar a Internet. Ningú s'ha trobat mai amb un problema així? Però em vaig adonar que ni tan sols sé quines paraules clau cercar-lo. Per tant, vaig crear ràpidament un script Lua per a aquesta tasca i ara l'he optimitzat. Això és el que vull compartir.

Descàrrega del torrent per parts

  1. començar a descarregar el torrent al primer dispositiu
  2. espereu fins que s'ompli la ROM
  3. posar en pausa la descàrrega
  4. transferiu el fitxer al segon dispositiu i afegiu un número al nom del fitxer
  5. tornem al primer punt fins que el fitxer es descarregui completament

Fusionar parts en un sol fitxer

Un cop rebuda l'última part, cal recollir-les en un fitxer sencer.

La tasca és senzilla:

  1. Llegint totes les parts alhora
  2. Si en alguna part la posició no és un byte zero, llavors ho escrivim a la sortida, en cas contrari escrivim zero

Funció merge_part accepta una sèrie de fils streams_in del qual llegeix una part de la mida buffer_length i retorna el resultat de la fusió de peces de diferents fils.

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
--[[

Funció string.gsub és adequat per a la tasca perquè trobarà peces plenes de zeros i lliurarà el que se li dóna.

--]]
                out_part = out_part:gsub(" +", function(zero_string)

                    if #in_part < find_index then
                        return -- не на что менять
                    end
--[[

string.gsub no indica la posició on es va trobar la coincidència. Per tant, fem una cerca paral·lela de la posició zero_string utilitzant la funció string.find. N'hi ha prou amb trobar el primer byte zero.

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

--[[

Ara si dins in_part hi ha dades per out_part copiar-los.

--]]
                    if #in_part >= start_index then
                        local end_index = start_index + #zero_string - 1
--[[

Talla de in_part part corresponent a la seqüència de zeros.

--]]
                        local part = in_part:sub(start_index, end_index)

                        if (part:byte(1) ~= 0) or part:find("[^ ]") then
--[[

В part hi ha dades.

--]]
                            if #part == #zero_string then
                                return part
                            else
--[[

part va resultar ser inferior a una seqüència de zeros. Complementem-ho amb ells.

--]]
                                return part..zero_string:sub(1, end_index - #in_part)
                            end
                        end
                    end
                end)
            end
        end
    end
    return out_part
end

Conclusió

Així, vam poder descarregar i muntar aquest fitxer en un ordinador. Després de la fusió, vaig treure el fitxer torrent de la tauleta. Vaig instal·lar un client torrent al meu PC i vaig comprovar el fitxer amb ell.

L'última part baixada a la tauleta es pot deixar a la distribució, però cal que torneu a comprovar les parts abans d'això i desmarqueu el fitxer perquè no es torni a descarregar.

Usat:

  1. Client torrent Flud en una tauleta.
  2. Client torrent qBittorent al PC.
  3. Guió Lua

Font: www.habr.com

Afegeix comentari