Descargando un torrent de 16 GB a través dunha tableta con 4 GB de espazo libre

Descargando un torrent de 16 GB a través dunha tableta con 4 GB de espazo libre

Unha tarefa:

Hai un PC sen Internet, pero é posible transferir o ficheiro a través de USB. Hai unha tableta con Internet desde a que se pode transferir este ficheiro. Podes descargar o torrent necesario na túa tableta, pero non hai espazo libre suficiente. O ficheiro do torrent é un e grande.

Camiño á solución:

Comecei o torrent para descargar. Cando case se esgotou o espazo libre, deixei a descarga. Conectei a tableta ao PC e pasei o ficheiro da tableta ao PC. Fixen unha pausa e, para a miña sorpresa, creouse de novo o ficheiro e o torrent continuou descargando coma se nada pasase.

Debido ao feito de que o cliente torrent establece a bandeira escasa no ficheiro no que escribe os datos recibidos, o sistema non tenta reservar 16 GB á vez e non se producirá un erro ao tentar escribir nun ficheiro máis aló de 4 GB.

Despois de repetir o procedemento catro veces, recibín catro ficheiros no meu PC que conteñen diferentes partes do mesmo torrent. Agora só queda xuntalos. O procedemento é esencialmente sinxelo. Debe substituír os cero bytes por outro valor se existe nunha posición determinada nun dos catro ficheiros.

Pareceume que un programa tan sinxelo debería estar en Internet. Ninguén se atopou nunca con tal problema? Pero decateime de que nin sequera sei que palabras clave buscar. Polo tanto, creei rapidamente un script Lua para esta tarefa e agora optimizeino. Isto é o que quero compartir.

Descargando o torrent por partes

  1. comeza a descargar o torrent no primeiro dispositivo
  2. agarde ata que se enche a ROM
  3. pausar a descarga
  4. transferir o ficheiro ao segundo dispositivo e engadir un número ao nome do ficheiro
  5. volvemos ao primeiro punto ata que o ficheiro estea descargado por completo

Unir partes nun só ficheiro

Despois de recibir a última parte, é necesario recollelas nun ficheiro completo.

A tarefa é sinxela:

  1. Lendo todas as partes á vez
  2. Se nalgunha parte a posición non é un byte cero, entón escribimos na saída, se non, escribimos cero

Función merge_part acepta unha matriz de fíos streams_in dos cales le unha parte do tamaño buffer_length e devolve o resultado da fusión de partes de diferentes fíos.

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ón string.gsub é axeitado para a tarefa porque atopará pezas cheas de ceros e entregará o que se lle dá.

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

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

string.gsub non transmite a posición na que se atopou a coincidencia. Polo tanto, facemos unha busca paralela da posición zero_string utilizando a función string.find. É suficiente atopar o primeiro byte cero.

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

--[[

Agora se dentro in_part hai datos para out_part copialos.

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

Corte de in_part parte correspondente á secuencia de ceros.

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

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

В part hai datos.

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

part resultou ser menor que unha secuencia de ceros. Complementémolo con eles.

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

Conclusión

Así, puidemos descargar e montar este ficheiro nun PC. Despois da fusión, tirei o ficheiro torrent da tableta. Instalei un cliente torrent no meu PC e comprobei o ficheiro con el.

A última parte descargada na tableta pódese deixar na distribución, pero cómpre habilitar a comprobación de novo das pezas antes e desmarque o ficheiro para que non se volva descargar.

Usado:

  1. Cliente flud torrent nunha tableta.
  2. Cliente torrent qBittorent en PC.
  3. Lua guión

Fonte: www.habr.com

Engadir un comentario