[#407882] Ruby extremely slow compared to PHP — Mick Jagger <lists@...>

Hello there, how are you? Hope you are fine. I am a PHP programmer

17 messages 2013/06/02

[#407908] TCPServer/Socket and Marshal problem — Panagiotis Atmatzidis <atma@...>

Hello,

18 messages 2013/06/03

[#407946] Is rubyquiz.com dead? — Alphonse 23 <lists@...>

Thread title says everything.

18 messages 2013/06/04

[#408012] Need help understanding recursion. — pedro oliva <lists@...>

Ive been reading Chris Pine's book 'Learn to Program' and its been going

11 messages 2013/06/06

[#408129] Getting Started With Development — Chamila Wijayarathna <cdwijayarathna@...>

I'm new to Ruby Development. I downloaded source from Github, but couldn't

24 messages 2013/06/11
[#408131] Re: Getting Started With Development — Per-erik Martin <lists@...> 2013/06/11

Ruby is often installed on linux, or can be easily installed with the

[#408146] Re: Getting Started With Development — "Chamila W." <lists@...> 2013/06/11

Per-erik Martin wrote in post #1112021:

[#408149] Re: Getting Started With Development — "Carlo E. Prelz" <fluido@...> 2013/06/11

Subject: Re: Getting Started With Development

[#408198] NokoGiri XML Parser — "Devender P." <lists@...>

Hi,

11 messages 2013/06/13

[#408201] trying to load a .rb file in irb — "Eric D." <lists@...>

I am trying to load a ruby program into irb and it will not load.

12 messages 2013/06/13

[#408205] Can I use Sinatra to render dynamic pages? — Ruby Student <ruby.student@...>

Hell Team,

18 messages 2013/06/13
[#408219] Re: Can I use Sinatra to render dynamic pages? — Nicholas Van Weerdenburg <vanweerd@...> 2013/06/14

You should be able to do this without JavaScript by using streaming.

[#408228] Re: Can I use Sinatra to render dynamic pages? — Ruby Student <ruby.student@...> 2013/06/14

Well, I got some good suggestions from everyone here. I thank you all for

[#408275] Compare and sort one array according to another. — masta Blasta <lists@...>

I have two arrays of objects that look something like this:

14 messages 2013/06/17

[#408276] Comparing objects — "Thom T." <lists@...>

How do I compare two objects in Ruby, considering only attributes

15 messages 2013/06/17

[#408307] getting the most out of Ruby — robin wood <lists@...>

I write a lot of scripts in Ruby, most are small simple things but some

13 messages 2013/06/18

[#408309] Creating ruby script exe — Rochit Sen <lists@...>

Hi All,

17 messages 2013/06/18

[#408357] Beginners problem with database and datamapper — cristian cristian <lists@...>

Hi all!

28 messages 2013/06/20

[#408437] How do I input a variable floating point number into Ruby Programs — "Michael P F." <lists@...>

I want to evaluate the following interactively:

10 messages 2013/06/23

[#408518] #!/usr/bin/env: No such file or directory — Todd Sterben <lists@...>

I am new to both linux and ruby. I am using Ubuntu and Ruby 1.9

17 messages 2013/06/27

[#408528] Designing a Cabinet class — Mike Vezzani <lists@...>

Hello all,

12 messages 2013/06/27

[#408561] Find elment in array of hashes — Rodrigo Lueneberg <lists@...>

array = {:id=>1, :price =>0.25} # index[0]

23 messages 2013/06/28

Re: TCPServer/Socket and Marshal problem

From: Joel VanderWerf <joelvanderwerf@...>
Date: 2013-06-03 20:01:41 UTC
List: ruby-talk #407918
On 06/03/2013 12:41 PM, Panagiotis Atmatzidis wrote:
>
> On 3 Ιουν 2013, at 21:24 , Joel VanderWerf <joelvanderwerf@gmail.com> wrote:
>
>> On 06/03/2013 11:47 AM, Panagiotis Atmatzidis wrote:
>>> Hello,
>>>
>>> I'm writing a client/server application using TCPSocket and TCPServer. To serialize the objects at this point I use Marshal, since it comes handy.
>> ...
>>> What I notice is that connection ends when the '\n' character appears. I think that the issue is me using "@con.gets" method instead of something more appropriate. I tried @con.read but since 'read' method waits for the remote party to send an 'EOF' or close the connection stalls.
>>>
>>> Is there any other method I can use instead of gets? I did a 'methods.sort' but I can't see and I don't know how to read about these methods using "ri". 'ri TCPSocket::getc' for example doesn't work.
>>
>> You can try
>>
>> Marshal.load(conn)
>>
>> on the client side. The Marshal#load method determines just how many bytes to read.
>
>
> Worked fine! Thank you! I don't get it thought, could you elaborate a bit?

Sure (sorry to be cryptic!).

If you look at the format of marshalled objects, there is always a way 
to determine how many bytes to expect. In the case of fixed length data, 
there is a type field followed by the data (floats for example). In the 
case of strings, arrays, hashes, etc. there are type and length fields 
followed by the items (which themselves will have type and possibly 
length fields). So #load always knows either the number of bytes to read 
or the number of times to iterate to read all the items. Recursively 
build the object tree, and you're done.

However, Marshal#load can't know, until this recursion finishes, the 
total number of bytes. There is no length field for the whole serialized 
blob. That's why load(sock.read(n)) doesn't work well with marshal.

Btw, if your objects are just strings, numbers, booleans, hashes, and 
arrays, then msgpack is a great alternative to marshal. It's not ruby 
specific, it's fast and compact, and it plays well with non-blocking io.

Why non-blocking io? You'll notice that if you Marshal.load(conn) and 
conn takes a long time to send all the bytes, then the thread that 
called #load is blocked. So, just start a thread per connection. That's 
fine if you only need a few connections at a time. With msgpack's 
buffering, it's possible to read only the complete objects from the 
connection, and then the thread is free to go on to another connection 
and read. (See msgpack doc for examples.) Btw, the yajl JSON lib does 
something like this too.

Cheers!


In This Thread