Ruby ArgumentError:在'load';中:封送数据太短

Ruby ArgumentError:在'load';中:封送数据太短,ruby,Ruby,我想实现多个进程。我必须将在不同子进程中排序的数据发送回父进程,然后合并数据。这是我代码的一部分: rd1,wt1 = IO.pipe # reader & writer pid1 = fork { rd1.close numbers = Marshal.load(Marshal.dump(copylist[0,p])) bubble_sort(numbers) sList[0] = numbers.clone wt1.write Marshal.dump(sLis

我想实现多个进程。我必须将在不同子进程中排序的数据发送回父进程,然后合并数据。这是我代码的一部分:

rd1,wt1 = IO.pipe # reader & writer

pid1 = fork {
  rd1.close
  numbers = Marshal.load(Marshal.dump(copylist[0,p]))
  bubble_sort(numbers)
  sList[0] = numbers.clone
  wt1.write Marshal.dump(sList[0])
  Process.exit!(true)
}

Process.waitpid(pid1)
Process.waitpid(pid2)
wt1.close
wt2.close

pid5 = fork {
  rd5.close
  a = Marshal.load(rd1.gets)
  b = Marshal.load(rd2.gets)
  mList[0] =  merge( a,b).clone
  wt5.write Marshal.dump(mList[0])
  Process.exit!(true)
}
pid1
pid7
rd1
rd7
wt1
wt7
pid1
pid4
是冒泡排序4数据的一部分
pid5
6
合并来自
pid1
2
PID3
4
的数据。最后,
pid7
合并来自
pid5
6
的数据

当数据大小较小时,它会成功,但当我输入较大的数据(10000)时:


然后,出现错误:
:在“加载”中:封送数据太短(ArgumentError)
和另一种错误:
在“加载”中:需要IO实例(TypeError)
。第一个错误行位于
pid5
a=…
pid6
b=…
。另一种错误行位于
pid7
b=…
。我的数据是否太大,无法使用此方法?

封送.load
封送.dump
使用二进制数据。短读的问题在于:

a = Marshal.load(rd1.gets)
b = Marshal.load(rd2.gets)
#获取
读取到新行(或文件结尾),然后停止。问题在于,Marshal.dump创建的二进制数据中可能存在新行


将两行中的
改为

@MudboyZh这太好了;不客气。既然您的代码可以工作,您可能希望将其提交给。我怀疑可以对其进行一些改进,但对工作代码的改进超出了本文的范围。CR也许能帮上忙。好的!我现在明白了。再次感谢你的帮助。我遇到了一个问题。当我输入更大尺寸的数据(30000,最大值为1000000)时,它将停留在
wt.write….
方法
write
是否有我必须注意的地方?@MudboyZh请将此作为一个新问题提问,使用常规代码、示例数据等。如果您愿意,新问题可以链接到此问题。对不起!这是我的新问题。
a = Marshal.load(rd1.gets)
b = Marshal.load(rd2.gets)