Копирование файла через сокет TCP в Ruby slow - PullRequest
3 голосов
/ 25 августа 2011

Мне нужно передать файл через сокеты:

# sender
require 'socket'
SIZE = 1024 * 1024 * 10

TCPSocket.open('127.0.0.1', 12345) do |socket| 
  File.open('c:/input.pdf', 'rb') do |file|
      while chunk = file.read(SIZE)
      socket.write(chunk)
    end
  end
end  


# receiver
require 'socket'
require 'benchmark'
SIZE = 1024 * 1024 * 10

server =  TCPServer.new("127.0.0.1", 12345)
puts "Server listening..."            
client = server.accept       

time = Benchmark.realtime do
  File.open('c:/output.pdf', 'w') do |file|
    while chunk = client.read(SIZE)
      file.write(chunk)
    end
  end
end

file_size = File.size('c:/output.pdf') / 1024 / 1024
puts "Time elapsed: #{time}. Transferred #{file_size} MB. Transfer per second: #{file_size / time} MB" and exit

Используя Ruby 1.9, я получаю скорость передачи ~ 16 МБ / с (~ 22 МБ / с с использованием 1.8) при передаче 80 МБ PDFфайл с / на локальный.Я новичок в программировании сокетов, но это выглядит довольно медленно по сравнению с использованием FileUtils.cp.Что-то я делаю не так?

Ответы [ 2 ]

1 голос
/ 14 октября 2016

Я знаю, что этот вопрос старый, но почему вы не можете сжать перед отправкой, а затем распаковать на принимающей стороне?

require 'zlib'

def compress(input)
  Zlib::Deflate.deflate(input)
end

def decompress(input)
  Zlib::Inflate.inflate(input)
end

(Бесстыдный штекер) AFT (https://github.com/wlib/aft) уже делает то, что вы делаете

1 голос
/ 25 августа 2011

Ну, даже с localhost вам все равно придется пройти через некоторые стека TCP, что приводит к неизбежным задержкам с фрагментацией и перестройкой пакетов. Вероятно, он не выходит из строя, когда вы будете ограничены 100 мегабитами (~ 12,5 МБ / с) в секунду или теоретическим максимумом в гигабит (~ 125 МБ / с).

Никаких из этих накладных расходов не существует для копирования файлов на диск. Вы должны помнить, что даже SATA1 дает вам 1,5 гигабит / с, и я был бы удивлен, если бы вы все еще работали на этом уровне. Кроме того, ваша ОС, несомненно, будет кешировать множество вещей, что невозможно при отправке через стек TCP.

16 МБ в секунду для меня не так уж и плохо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...