참고: Rubby의 Net:FTP 분할 다운로드

9777 단어 Ruby
docs.ruby-lang.org 또는 rubygems.org에 괜찮은 실복이 있다고 생각했지만 찾지 못했습니다.

  • Net::FTP#retrbinary를 사용하여 오프셋 지정하기

  • Net::FTP#resume=에서 resume 모드
  • 로 설정해야 합니다.

  • IO.copy_stream
  • 좋은 느낌이 나지 않는 파일 결합 처리IO.copy_stream를 사용했다
  • 통합 병렬 분할 다운로드 결과의 논리를 몰라
  • 동시 접속 수를 제한하는 서버 상대방에게는 해당되지 않음
  • require 'net/ftp'
    require 'tmpdir'
    require 'thwait'
    
    DEBUG = !ENV.fetch('DEBUG', '').empty?
    CONCURRENT = ENV.fetch('CONCURRENT').to_i
    FTP_HOST = ENV.fetch('FTP_HOST')
    FTP_PORT = ENV.fetch('FTP_PORT').to_i
    FTP_USER = ENV.fetch('FTP_USER')
    FTP_PASS = ENV.fetch('FTP_PASS')
    FTP_PATH = ENV.fetch('FTP_PATH')
    
    def establish_connection
      Net::FTP.new(FTP_HOST, port: FTP_PORT, username: FTP_USER, password: FTP_PASS, passive: true, debug_mode: DEBUG)
    end
    
    content_size = establish_connection.size(FTP_PATH)
    page_size = (content_size.to_f / CONCURRENT).ceil
    
    Dir.mktmpdir do |dir|
      threads = []
      CONCURRENT.times do |i|
        offset = page_size * i
        next if offset >= content_size
    
        threads << Thread.start(i) do |t|
          File.open("#{dir}/#{t}", 'wb') do |page|
            ftp = establish_connection
            ftp.resume = true
    
            retrieved = 0
            ftp.retrbinary("RETR #{FTP_PATH}", Net::FTP::DEFAULT_BLOCKSIZE, offset) do |chunk|
              rest = page_size - retrieved
              retrievable = [rest, chunk.bytesize].min
              break if retrievable <= 0
    
              retrieved += page.write(chunk[0, retrievable])
            end
          end
        end
      end
      ThreadsWait.all_waits(*threads)
    
      File.open('downloaded', 'wb') do |output|
        CONCURRENT.times do |i|
          path = "#{dir}/#{i}"
          next unless File.exist?(path)
          IO.copy_stream(path, output)
        end
      end
    end
    
    __END__
    
    ### e.g. 495MB CentOS ISO file
    
    ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin17]
    
    1: 165.29 real         5.34 user         4.74 sys
    3:  99.68 real         5.23 user         6.12 sys
    5:  88.19 real         5.56 user         7.43 sys
    

    좋은 웹페이지 즐겨찾기