Project

General

Profile

Actions

Backport #1063

closed

in `write': Not enough space - <STDOUT> (Errno::ENOMEM) on Windows XP

Added by konung (Nick Gorbikoff) almost 16 years ago. Updated over 13 years ago.

Status:
Closed
[ruby-core:21613]

Description

=begin
Hi, All.

I'm getting an error message when running my test codes on Windows XP under latest ruby-1.9.1-preview - that I downloaded of the website in binary form ( I didn't compile it).


 test.rb:34:in `write': Not enough space -  (Errno::ENOMEM)
         from test.rb:34:in `puts'
         from test.rb:34:in `puts'
         from test.rb:34:in `'
 

Now the error message I'm getting is strange - all I could find about it is actually - that somebody had it on *nix machines, but not on windows. Also the same code runs fine under my ruby-1.8.6 - patch 111. As I understand that code means that it's a running out of swap space. Well there is a pagefile on windows, which I guess I guess is windows swap equivalent, but I'm running on a fairly fast machine ( dual core pent 4, with 4 gbs of RAM and system managed pagefile.) So I don't think I'm actually running of memory. :-)

Below is my code that I run ( mind it's just a stupid benchmark code - there is no utility to it, but I was surprised that 1.9.1 couldn't handle what 1.8.6 did) :


 a = Time.now
 k = []
 
 class Array
   def inject(n)
      each { |value| n = yield(n, value) }
      n
   end
   def sum
     inject(0) { |n, value| n + value }
   end
   def product
     inject(1) { |n, value| n * value }
   end
 end
 
 def fibUpTo(max)
   i1, i2 = 1, 1        # parallel assignment
   while i1 <= max
     yield i1
     i1, i2 = i2, i1+i2
   end
 end
 
 fibUpTo(100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000) { |f| k.push(f) }
 puts "k is: "
 puts k
 s = k.sum
 p = k.product
 puts "s is: "
 puts s
 
 puts "p is: "
 puts p
 
 b = Time.now
 
 c = b-a
 puts c
 puts "it took: " + c.to_s + " seconds to complete"
 
 

=end


Files

test.rb (753 Bytes) test.rb konung (Nick Gorbikoff), 01/28/2009 02:47 AM

Related issues 1 (0 open1 closed)

Related to Backport186 - Backport #766: 'Not enough space' error on windowsRejectedusa (Usaku NAKAMURA)Actions
Actions #1

Updated by konung (Nick Gorbikoff) almost 16 years ago

=begin
Also the same code - attached in an rb file.

I understand that I might be tryign to calculate a number out of bounds, but it seems to me that if I can do it in 1.8.6 - I should be able in 1.9.1 .

Thanks

Let me know if I can provide any additional information.
=end

Actions #2

Updated by rogerdpack (Roger Pack) almost 16 years ago

=begin
Hmm. It does seem that running

STDOUT.write "a"*100000000

works on windows in 1.8.6 but not 1.9

Linux seems fine, however.
=end

Actions #3

Updated by usa (Usaku NAKAMURA) almost 16 years ago

  • Status changed from Open to Closed
  • % Done changed from 0 to 100

=begin
Applied in changeset r21903.
=end

Actions #4

Updated by usa (Usaku NAKAMURA) almost 16 years ago

=begin
Hello,

In message "[ruby-core:21616] [Bug #1063] in `write': Not enough space - (Errno::ENOMEM) on Windows XP"
on Jan.28,2009 03:06:21, wrote:

Hmm. It does seem that running

STDOUT.write "a"*100000000

works on windows in 1.8.6 but not 1.9

It's Windows' bug. The border is about 60KB.
I found this bug about 7 years ago, and I considered that
it is not critical.

If you want to reproduce on 1.8.6,
STDOUT.binmode.write "a"*100000000

And if you want to reproduce it without ruby,
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>

#define LEN 100000000

int main()
{
DWORD sz;
char *str = malloc(LEN + 1);
memset(str, 'a', LEN);
str[LEN] = '\0';
WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), str, LEN, &sz, NULL);
printf("%d, %d\n", sz, GetLastError());
free(str);
return 0;
}

Regards,

U.Nakamura

=end

Actions #5

Updated by rogerdpack (Roger Pack) over 15 years ago

=begin
Would it be possible to get this backported to 1.9.1?
Currently with 1.9.1p129 it seems to not be

C:\dev\blade_copy>gem list -r

*** REMOTE GEMS ***

ERROR: While executing gem ... (Errno::ENOMEM)
Not enough space -

Thanks!
-=r
=end

Actions #6

Updated by d-snp (Tinco Andringa) almost 15 years ago

=begin
It's still broken/broken again :(

ruby --version: ruby 1.9.1p129 (2009-05-12 revision 23412) [i386-mswin32]

Code: puts 'a' * 100000

echo.rb:1:in write': Not enough space - <STDOUT> (Errno::ENOMEM) from echo.rb:1:in puts'
from echo.rb:1:in puts' from echo.rb:1:in '

Please not that although that code is rather theoretical the error occurs in very fast making it unworkable.
=end

Actions #7

Updated by usa (Usaku NAKAMURA) almost 15 years ago

=begin
Hello,

In message "[ruby-core:26833] [Bug #1063] in `write': Not enough space - (Errno::ENOMEM) on Windows XP"
on Nov.20,2009 07:42:39, wrote:

It's still broken/broken again :(

ruby --version: ruby 1.9.1p129 (2009-05-12 revision 23412) [i386-mswin32]

You should request backporting r21903 to ruby_1_9_1.

Regards,

U.Nakamura

=end

Actions #8

Updated by usa (Usaku NAKAMURA) almost 15 years ago

  • Status changed from Closed to Assigned
  • Assignee set to yugui (Yuki Sonoda)

=begin

=end

Actions #9

Updated by yugui (Yuki Sonoda) almost 15 years ago

  • Status changed from Assigned to Closed

=begin
This issue was solved with changeset r26004.
Nick, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.

=end

Actions #10

Updated by rogerdpack (Roger Pack) over 13 years ago

=begin
For followers, a hackey kludgey work-around is the following:

class String
def to_2d_array(value)
unpack("a#{value}"*((size/value)+((size%value>0)?1:0)))
end
end

class << $stdout; alias old_write write; def write a; a.to_s.to_2d_array(1024).each{|little| old_write little}; end; end

Cheers!
-r
=end

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0