Að hlaða niður 16GB straumi í gegnum spjaldtölvu með 4GB af lausu plássi

Að hlaða niður 16GB straumi í gegnum spjaldtölvu með 4GB af lausu plássi

Verkefni:

Það er tölva án internets, en það er hægt að flytja skrána í gegnum USB. Það er spjaldtölva með internetinu sem hægt er að flytja þessa skrá frá. Þú getur halað niður tilskildum straumi á spjaldtölvuna þína, en það er ekki nóg pláss. Skráin í straumnum er ein og stór.

Leið að lausn:

Ég byrjaði á straumnum til að sækja. Þegar laust plássið var næstum horfið gerði ég hlé á niðurhalinu. Ég tengdi spjaldtölvuna við tölvuna og færði skrána úr spjaldtölvunni yfir á tölvuna. Ég gerði hlé og mér til undrunar var skráin búin til aftur og straumurinn hélt áfram að hlaða niður eins og ekkert hefði í skorist.

Vegna þess að torrent biðlarinn setur sparse flagið á skrána þar sem hann skrifar móttekin gögn, reynir kerfið ekki að panta 16GB í einu og villa mun ekki koma upp þegar reynt er að skrifa í skrá sem er lengra en 4GB.

Eftir að hafa endurtekið ferlið fjórum sinnum fékk ég fjórar skrár á tölvuna mína sem innihéldu mismunandi hluta af sama straumnum. Nú er bara eftir að setja þau saman. Aðferðin er í meginatriðum einföld. Þú þarft að skipta út núllbætunum fyrir annað gildi ef það er til á tilteknum stað í einni af fjórum skrám.

Mér fannst svo einfalt forrit eiga að vera á netinu. Hefur enginn lent í slíku vandamáli? En ég áttaði mig á því að ég veit ekki einu sinni hvaða leitarorð ég á að leita að því. Þess vegna bjó ég fljótt til Lua handrit fyrir þetta verkefni og nú hef ég fínstillt það. Þetta er það sem ég vil deila.

Að sækja strauminn í hlutum

  1. byrjaðu að hlaða niður straumnum á fyrsta tækinu
  2. bíddu þar til ROM er fyllt
  3. gera hlé á niðurhalinu
  4. flytja skrána í annað tækið og bæta númeri við skráarnafnið
  5. við snúum aftur að fyrsta punktinum þar til skránni er hlaðið niður alveg

Sameina hluta í eina skrá

Eftir að síðasti hlutinn hefur borist er nauðsynlegt að safna þeim í eina heila skrá.

Verkefnið er einfalt:

  1. Að lesa alla hluta í einu
  2. Ef staðan er í einhverjum hluta ekki núllbæti, þá skrifum við það í úttakið, annars skrifum við núll

Virka merge_part tekur við fjölda þráða streams_in þar af er hluti af stærð buffer_length og skilar niðurstöðu sameiningar hluta úr mismunandi þráðum.

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

Virka string.gsub hentar fyrir verkefnið vegna þess að það finnur stykki fyllt með núllum og skilar því sem því er gefið.

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

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

string.gsub gefur ekki til kynna hvar samsvörun fannst. Þess vegna gerum við samhliða leit að stöðunni zero_string með því að nota aðgerðina string.find. Það er nóg að finna fyrsta núllbætið.

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

--[[

Nú ef inn in_part það eru gögn fyrir out_part afrita þá.

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

Klippt úr in_part hluti sem samsvarar röð núllanna.

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

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

В part það eru gögn.

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

part reyndist vera minni en röð af núllum. Við skulum bæta það með þeim.

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

Ályktun

Þannig gátum við hlaðið niður og sett þessa skrá saman á tölvu. Eftir sameininguna dró ég torrentskrána úr spjaldtölvunni. Ég setti upp torrent biðlara á tölvunni minni og athugaði skrána með honum.

Síðasta niðurhalaða hlutann á spjaldtölvunni er hægt að skilja eftir á dreifingunni, en þú þarft að virkja endurskoðun á hlutunum fyrir þetta og taka hakið úr skránni svo hún hleðst ekki niður aftur.

Notað:

  1. Flud torrent viðskiptavinur á spjaldtölvu.
  2. Torrent viðskiptavinur qBittorent á tölvu.
  3. Lua handrit

Heimild: www.habr.com

Bæta við athugasemd