Prenos 16 GB torrenta prek tablice s 4 GB prostega prostora

Prenos 16 GB torrenta prek tablice s 4 GB prostega prostora

Naloga:

Obstaja osebni računalnik brez interneta, vendar je mogoče prenesti datoteko prek USB-ja. Obstaja tablica z internetom, s katere je mogoče prenesti to datoteko. Zahtevani torrent lahko prenesete na svoj tablični računalnik, vendar ni dovolj prostega prostora. Datoteka v torrentu je ena in velika.

Pot do rešitve:

Zagnal sem torrent za prenos. Ko je prostega prostora skoraj zmanjkalo, sem prenos zaustavil. Tablico sem povezal z računalnikom in datoteko iz tablice prestavil v računalnik. Zaustavil sem se in na moje presenečenje je bila datoteka znova ustvarjena in torrent se je nalagal naprej, kot da se ni nič zgodilo.

Ker torrent odjemalec nastavi datoteko, v katero zapisuje prejete podatke, zastavico sparse, sistem ne poskuša rezervirati 16 GB naenkrat in ne bo prišlo do napake pri poskusu pisanja v datoteko, večjo od 4 GB.

Po štirikratni ponovitvi postopka sem na svoj računalnik prejel štiri datoteke z različnimi deli istega torrenta. Zdaj jih preostane le še sestaviti. Postopek je v bistvu preprost. Ničelne bajte morate zamenjati z drugo vrednostjo, če obstaja na danem mestu v eni od štirih datotek.

Zdelo se mi je, da bi moral biti tako preprost program na internetu. Se še nihče ni srečal s tako težavo? Vendar sem ugotovil, da sploh ne vem, katere ključne besede naj iščem. Zato sem hitro ustvaril skript Lua za to nalogo in zdaj sem ga optimiziral. To želim deliti.

Prenos torrenta po delih

  1. začnite prenašati torrent na prvi napravi
  2. počakajte, da se ROM napolni
  3. začasno ustavite prenos
  4. prenesite datoteko v drugo napravo in imenu datoteke dodajte številko
  5. vračamo se na prvo točko, dokler se datoteka v celoti ne prenese

Združevanje delov v eno datoteko

Po prejemu zadnjega dela jih je potrebno zbrati v eno celotno datoteko.

Naloga je preprosta:

  1. Branje vseh delov hkrati
  2. Če v nekem delu pozicija ni ničelni bajt, potem to zapišemo na izhod, drugače pa ničlo

Funkcija merge_part sprejme niz niti streams_in od tega se glasi del velikosti buffer_length in vrne rezultat združevanja delov iz različnih niti.

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

Funkcija string.gsub je primeren za nalogo, ker bo našel kose, napolnjene z ničlami, in dostavil, kar mu je dano.

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

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

string.gsub ne izraža položaja, na katerem je bilo ujemanje. Zato vzporedno iščemo položaj zero_string uporabo funkcije string.find. Dovolj je najti prvi ničelni bajt.

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

--[[

Zdaj, če v in_part obstajajo podatki za out_part kopirajte jih.

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

Izrezano iz in_part del, ki ustreza zaporedju ničel.

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

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

В part obstajajo podatki.

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

part se je izkazalo za manjše od zaporedja ničel. Dopolnimo ga z njimi.

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

Zaključek

Tako smo lahko prenesli in sestavili to datoteko na osebnem računalniku. Po združitvi sem torrent datoteko potegnil iz tablice. Na računalnik sem namestil torrent odjemalca in z njim preveril datoteko.

Zadnji preneseni del na tablici lahko pustite na distribuciji, vendar morate pred tem omogočiti ponovno preverjanje delov in odkljukati datoteko, da se ne naloži znova.

Rabljeno:

  1. Flud torrent odjemalec na tablici.
  2. Torrent odjemalec qBittorent na osebnem računalniku.
  3. skript Lua

Vir: www.habr.com

Dodaj komentar