ArgumentError:在'load'中:编组数据太短

时间:2015-04-16 11:15:45

标签: 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(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 ... pid7rd1 ... rd7wt1 ... wt7pid1 ... pid4是数据的冒泡排序4部分。 pid56合并来自pid12pid 34的数据。最后,pid7合并了pid56的数据。

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

Data example : 121 45 73 89 11 452 515 32 1 99 4 88 41 53 159 482 2013 2 ...

然后,出现错误::in 'load': marshal data too short (ArgumentError)和另一种错误:in 'load': instance of IO needed (TypeError)。第一个错误行位于pid5a = ...pid6b = ...。另一种错误行位于pid7b = ...。我的数据对于这种方法来说太大了吗?

1 个答案:

答案 0 :(得分:1)

Marshal.loadMarshal.dump使用二进制数据。短读取的问题在于:

a = Marshal.load(rd1.gets)
b = Marshal.load(rd2.gets)

#gets读取新行(或文件末尾)然后停止。麻烦的是Marshal.dump创建的二进制数据中可能存在换行符。

在两行中将gets更改为read