gpt4 book ai didi

ruby - 在 Ruby 中通过 TCP 套接字复制文件很慢

转载 作者:数据小太阳 更新时间:2023-10-29 08:05:54 26 4
gpt4 key购买 nike

我需要通过套接字传输文件:

# 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,当从/向本地主机传输 80MB PDF 文件时,我得到的传输速率约为 16MB/s(使用 1.8 时约为 22MB/s)。我是套接字编程的新手,但与仅使用 FileUtils.cp 相比,这似乎相当慢。我做错了什么吗?

最佳答案

好吧,即使使用 localhost,您仍然需要通过 一些 TCP 堆栈,不可避免地引入数据包分段和重建延迟。它可能不会在您被限制为每秒 100 兆位(~12.5 MB/s)或千兆位(~125 MB/s)理论最大值的情况下出现。

将原始文件从磁盘复制到磁盘不存在任何开销。您应该记住,即使是 SATA1 也能提供 1.5 吉比特/秒的速度,如果您仍在该水平上运行,我会感到很惊讶。最重要的是,您的操作系统本身无疑会缓存很多东西,这在通过 TCP 堆栈发送时是不可能的。

每秒 16MB 对我来说还不错。

关于ruby - 在 Ruby 中通过 TCP 套接字复制文件很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7188191/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com