Elŝuto de 16GB-torento per tablojdo kun 4GB de libera spaco

Elŝuto de 16GB-torento per tablojdo kun 4GB de libera spaco

Tasko:

Estas komputilo sen Interreto, sed eblas translokigi la dosieron per USB. Estas tablojdo kun Interreto de kiu ĉi tiu dosiero povas esti translokigita. Vi povas elŝuti la bezonatan torenton sur via tablojdo, sed ne estas sufiĉe libera spaco. La dosiero en la torento estas unu kaj granda.

Vojo al solvo:

Mi komencis la torenton por elŝuti. Kiam la libera spaco preskaŭ malaperis, mi paŭzis la elŝuton. Mi konektis la tablojdon al la komputilo kaj movis la dosieron de la tablojdo al la komputilo. Mi paŭzis kaj je mia surprizo la dosiero estis kreita denove kaj la torento daŭre elŝutis kvazaŭ nenio estus okazinta.

Pro la fakto, ke la torenta kliento metas la malabundan flagon al la dosiero, en kiu ĝi skribas la ricevitajn datumojn, la sistemo ne provas rezervi 16GB samtempe kaj eraro ne okazos kiam vi provas skribi al dosiero pli ol 4GB.

Ripetinte la proceduron kvar fojojn, mi ricevis kvar dosierojn en mia komputilo enhavantaj malsamajn partojn de la sama torento. Nun restas nur kunmeti ilin. La proceduro estas esence simpla. Vi devas anstataŭigi la nul bajtojn per alia valoro se ĝi ekzistas ĉe donita pozicio en unu el la kvar dosieroj.

Ŝajnis al mi, ke tia simpla programo estu en la Interreto. Ĉu neniu iam renkontis tian problemon? Sed mi konstatis, ke mi eĉ ne scias, kiajn ŝlosilvortojn serĉi ĝin. Tial mi rapide kreis Lua-skripton por ĉi tiu tasko kaj nun mi optimumigis ĝin. Jen kion mi volas dividi.

Elŝutante la torenton en partoj

  1. komencu elŝuti la torenton sur la unua aparato
  2. atendu ĝis la ROM pleniĝos
  3. paŭzi la elŝuton
  4. translokigu la dosieron al la dua aparato kaj aldonu numeron al la dosiernomo
  5. ni revenas al la unua punkto ĝis la dosiero estas tute elŝutita

Kunfandi partojn en unu dosieron

Post kiam la lasta parto estas ricevita, necesas kolekti ilin en unu tutan dosieron.

La tasko estas simpla:

  1. Legante ĉiujn partojn samtempe
  2. Se en iu parto la pozicio ne estas nula bajto, tiam ni skribas ĝin al la eligo, alie ni skribas nul

funkcio merge_part akceptas tabelon da fadenoj streams_in el kiu legas parto de grandeco buffer_length kaj resendas la rezulton de kunfandado de partoj de malsamaj fadenoj.

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

funkcio string.gsub taŭgas por la tasko ĉar ĝi trovos pecojn plenigitajn per nuloj kaj liveros tion, kio estas donita al ĝi.

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

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

string.gsub ne transdonas la pozicion ĉe kiu la matĉo estis trovita. Tial ni faras paralelan serĉon por la pozicio zero_string uzante la funkcion string.find. Sufiĉas trovi la unuan nul bajton.

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

--[[

Nun se en in_part estas datumoj por out_part kopii ilin.

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

Tranĉi el in_part parto responda al la vico de nuloj.

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

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

В part estas datumoj.

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

part montriĝis malpli ol vico de nuloj. Ni kompletigu ĝin per ili.

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

konkludo

Tiel, ni povis elŝuti kaj kunmeti ĉi tiun dosieron sur komputilo. Post la kunfandiĝo, mi eltiris la torentan dosieron el la tablojdo. Mi instalis torentan klienton en mia komputilo kaj kontrolis la dosieron per ĝi.

La lasta elŝutita parto sur la tablojdo povas esti lasita en la distribuo, sed vi devas ebligi rekontroladon de la partoj antaŭ tio kaj malmarki la dosieron por ke ĝi ne elŝutu denove.

Uzita:

  1. Flud torrent-kliento sur tablojdo.
  2. Torrent-kliento qBittorent en komputilo.
  3. Lua skripto

fonto: www.habr.com

Aldoni komenton