16GB рдЦрд╛рд▓реА рд╕реНрдерд╛рди рд╡рд╛рд▓реЗ рдЯреИрдмрд▓реЗрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ 4GB рдХрд╛ рдЯреЛрд░реЗрдВрдЯ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдирд╛

16GB рдЦрд╛рд▓реА рд╕реНрдерд╛рди рд╡рд╛рд▓реЗ рдЯреИрдмрд▓реЗрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ 4GB рдХрд╛ рдЯреЛрд░реЗрдВрдЯ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдирд╛

рдЙрджреНрджреЗрд╢реНрдп:

рдЗрдВрдЯрд░рдиреЗрдЯ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдкреАрд╕реА рд╣реИ, рд▓реЗрдХрд┐рди рдпреВрдПрд╕рдмреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред рдЗрдВрдЯрд░рдиреЗрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рдЯреИрдмрд▓реЗрдЯ рд╣реИ рдЬрд┐рд╕рд╕реЗ рдпрд╣ рдлрд╛рдЗрд▓ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рдЖрдк рдЕрдкрдиреЗ рдЯреЗрдмрд▓реЗрдЯ рдкрд░ рдЖрд╡рд╢реНрдпрдХ рдЯреЛрд░реЗрдВрдЯ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкрд░реНрдпрд╛рдкреНрдд рдЦрд╛рд▓реА рд╕реНрдерд╛рди рдирд╣реАрдВ рд╣реИред рдЯреЛрд░реЗрдВрдЯ рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдПрдХ рдФрд░ рдмрдбрд╝реА рд╣реИред

рд╕рдорд╛рдзрд╛рди рдХрд╛ рдорд╛рд░реНрдЧ:

рдореИрдВрдиреЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреЛрд░реЗрдВрдЯ рд╢реБрд░реВ рдХрд┐рдпрд╛ред рдЬрдм рдЦрд╛рд▓реА рдЬрдЧрд╣ рд▓рдЧрднрдЧ рдЦрд╝рддреНрдо рд╣реЛ рдЧрдИ рддреЛ рдореИрдВрдиреЗ рдбрд╛рдЙрдирд▓реЛрдб рд░реЛрдХ рджрд┐рдпрд╛ред рдореИрдВрдиреЗ рдЯреИрдмрд▓реЗрдЯ рдХреЛ рдкреАрд╕реА рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд┐рдпрд╛ рдФрд░ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЯреИрдмрд▓реЗрдЯ рд╕реЗ рдкреАрд╕реА рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ред рдореИрдВ рд░реБрдХрд╛ рдФрд░ рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реБрдЖ рдХрд┐ рдлрд╝рд╛рдЗрд▓ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдИ рдЧрдИ рдФрд░ рдЯреЛрд░реЗрдВрдЯ рдбрд╛рдЙрдирд▓реЛрдб рд╣реЛрддрд╛ рд░рд╣рд╛ рдЬреИрд╕реЗ рдХрд┐ рдХреБрдЫ рд╣реБрдЖ рд╣реА рди рд╣реЛред

рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рдЯреЛрд░реЗрдВрдЯ рдХреНрд▓рд╛рдЗрдВрдЯ рдЙрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╡рд┐рд░рд▓ рдзреНрд╡рдЬ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╡рд╣ рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рд▓рд┐рдЦрддрд╛ рд╣реИ, рд╕рд┐рд╕реНрдЯрдо рдПрдХ рдмрд╛рд░ рдореЗрдВ 16GB рдЖрд░рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ 4GB рд╕реЗ рдЕрдзрд┐рдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╕рдордп рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реЛрдЧреАред

рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЪрд╛рд░ рдмрд╛рд░ рджреЛрд╣рд░рд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рдЕрдкрдиреЗ рдкреАрд╕реА рдкрд░ рдПрдХ рд╣реА рдЯреЛрд░реЗрдВрдЯ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рднрд╛рдЧреЛрдВ рд╡рд╛рд▓реА рдЪрд╛рд░ рдлрд╝рд╛рдЗрд▓реЗрдВ рдкреНрд░рд╛рдкреНрдд рд╣реБрдИрдВред рдЕрдм рдмрд╕ рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╕рд╛рде рд░рдЦрдирд╛ рдмрд╛рдХреА рд╣реИред рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореВрд▓рддрдГ рд╕рд░рд▓ рд╣реИ. рдпрджрд┐ рд╢реВрдиреНрдп рдмрд╛рдЗрдЯреНрд╕ рдЪрд╛рд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдореЗрдВ рджрд┐рдП рдЧрдП рд╕реНрдерд╛рди рдкрд░ рдореМрдЬреВрдж рд╣реИ, рддреЛ рдЖрдкрдХреЛ рд╢реВрдиреНрдп рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдорд╛рди рд╕реЗ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрд╛ рдХрд┐ рдЗрддрдирд╛ рд╕рд░рд▓ рдХрд╛рд░реНрдпрдХреНрд░рдо рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдХреНрдпрд╛ рдХрднреА рдХрд┐рд╕реА рдХреЛ рдРрд╕реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдкрдбрд╝рд╛? рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдореБрдЭреЗ рдпрд╣ рднреА рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреМрди рд╕реЗ рдХреАрд╡рд░реНрдб рдЦреЛрдЬреЗрдВред рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рддреБрд░рдВрдд рдЗрд╕ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рд▓реБрдЖ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрдирд╛рдИ рдФрд░ рдЕрдм рдореИрдВрдиреЗ рдЗрд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░ рд▓рд┐рдпрд╛ рд╣реИред рдпрд╣реА рдореИрдВ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ.

рдЯреЛрд░реЗрдВрдЯ рдХреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдирд╛

  1. рдкрд╣рд▓реЗ рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рдЯреЛрд░реЗрдВрдЯ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдирд╛ рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрдВ
  2. ROM рднрд░ рдЬрд╛рдиреЗ рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ
  3. рдбрд╛рдЙрдирд▓реЛрдб рд░реЛрдХреЗрдВ
  4. рдлрд╝рд╛рдЗрд▓ рдХреЛ рджреВрд╕рд░реЗ рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВ рдФрд░ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдореЗрдВ рдПрдХ рдирдВрдмрд░ рдЬреЛрдбрд╝реЗрдВ
  5. рдлрд╝рд╛рдЗрд▓ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рд╣реЛрдиреЗ рддрдХ рд╣рдо рдкрд╣рд▓реЗ рдмрд┐рдВрджреБ рдкрд░ рд▓реМрдЯрддреЗ рд╣реИрдВ

рднрд╛рдЧреЛрдВ рдХреЛ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╡рд┐рд▓рдп рдХрд░рдирд╛

рдЕрдВрддрд┐рдо рднрд╛рдЧ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╕рдВрдкреВрд░реНрдг рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдХрддреНрд░рд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рдХрд╛рд░реНрдп рд╕рд░рд▓ рд╣реИ:

  1. рд╕рднреА рднрд╛рдЧреЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рдкрдврд╝рдирд╛
  2. рдпрджрд┐ рдХрд┐рд╕реА рднрд╛рдЧ рдореЗрдВ рд╕реНрдерд┐рддрд┐ рд╢реВрдиреНрдп рдмрд╛рдЗрдЯ рдирд╣реАрдВ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕реЗ рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдЕрдиреНрдпрдерд╛ рд╣рдо рд╢реВрдиреНрдп рд▓рд┐рдЦрддреЗ рд╣реИрдВ

рд╕рдорд╛рд░реЛрд╣ merge_part рдзрд╛рдЧреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ streams_in рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдЖрдХрд╛рд░ рдХрд╛ рдПрдХ рднрд╛рдЧ рдкрдврд╝рддрд╛ рд╣реИ buffer_length рдФрд░ рд╡рд┐рднрд┐рдиреНрди рдзрд╛рдЧреЛрдВ рд╕реЗ рднрд╛рдЧреЛрдВ рдХреЗ рд╡рд┐рд▓рдп рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд▓реМрдЯрд╛рддрд╛ рд╣реИред

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

рд╕рдорд╛рд░реЛрд╣ string.gsub рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╢реВрдиреНрдп рд╕реЗ рднрд░реЗ рдЯреБрдХрдбрд╝реЛрдВ рдХреЛ рдвреВрдВрдвреЗрдЧрд╛ рдФрд░ рдЬреЛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЙрд╕реЗ рд╡рд┐рддрд░рд┐рдд рдХрд░реЗрдЧрд╛ред

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

                    if #in_part < find_index then
                        return -- ╨╜╨╡ ╨╜╨░ ╤З╤В╨╛ ╨╝╨╡╨╜╤П╤В╤М
                    end
--[[

string.gsub рдпрд╣ рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рдирд╣реАрдВ рдмрддрд╛рддрд╛ рдЬрд┐рд╕ рдкрд░ рдорд┐рд▓рд╛рди рдкрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕рд▓рд┐рдП, рд╣рдо рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рдирд╛рдВрддрд░ рдЦреЛрдЬ рдХрд░рддреЗ рд╣реИрдВ zero_string рд╕рдорд╛рд░реЛрд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ string.find. рдпрд╣ рдкрд╣рд▓рд╛ рд╢реВрдиреНрдп рдмрд╛рдЗрдЯ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред

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

--[[

рдЕрдм рдЕрдЧрд░ рдЕрдВрджрд░ in_part рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рд╣реИ out_part рдЙрдиреНрд╣реЗрдВ рдХреЙрдкреА рдХрд░реЗрдВ.

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

рд╕реЗ рдХрд╛рдЯреЗрдВ in_part рд╢реВрдиреНрдп рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЗ рдЕрдиреБрд░реВрдк рднрд╛рдЧ.

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

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

╨Т part рдбреЗрдЯрд╛ рд╣реИ.

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

part рд╢реВрдиреНрдп рдХреЗ рдЕрдиреБрдХреНрд░рдо рд╕реЗ рдХрдо рдирд┐рдХрд▓рд╛ред рдЖрдЗрдП рдЗрд╕реЗ рдЙрдирдХреЗ рд╕рд╛рде рдкреВрд░рдХ рдХрд░реЗрдВред

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

рдирд┐рд╖реНрдХрд░реНрд╖

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдПрдХ рдкреАрд╕реА рдкрд░ рдбрд╛рдЙрдирд▓реЛрдб рдФрд░ рдЕрд╕реЗрдВрдмрд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдереЗред рд╡рд┐рд▓рдп рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдЯреИрдмрд▓реЗрдЯ рд╕реЗ рдЯреЛрд░реЗрдВрдЯ рдлрд╝рд╛рдЗрд▓ рдирд┐рдХрд╛рд▓реАред рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдкреАрд╕реА рдкрд░ рдПрдХ рдЯреЛрд░реЗрдВрдЯ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдФрд░ рдЙрд╕рд╕реЗ рдлрд╝рд╛рдЗрд▓ рдХреА рдЬрд╛рдБрдЪ рдХреАред

рдЯреЗрдмрд▓реЗрдЯ рдкрд░ рдЕрдВрддрд┐рдо рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рднрд╛рдЧ рд╡рд┐рддрд░рдг рдкрд░ рдЫреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рднрд╛рдЧреЛрдВ рдХреА рдкреБрдирдГ рдЬрд╛рдВрдЪ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдФрд░ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЕрдирдЪреЗрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рджреЛрдмрд╛рд░рд╛ рдбрд╛рдЙрдирд▓реЛрдб рди рд╣реЛред

рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛:

  1. рдПрдХ рдЯреЗрдмрд▓реЗрдЯ рдкрд░ рдлрд╝реНрд▓реВрдб рдЯреЛрд░реЗрдВрдЯ рдХреНрд▓рд╛рдЗрдВрдЯред
  2. рдкреАрд╕реА рдкрд░ рдЯреЛрд░реЗрдВрдЯ рдХреНрд▓рд╛рдЗрдВрдЯ qBittorentред
  3. рд▓реБрдЖ рд╕реНрдХреНрд░рд┐рдкреНрдЯ

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ