Project

General

Profile

Backport #1063

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

Added by konung (Nick Gorbikoff) over 10 years ago. Updated over 8 years ago.

Status:
Closed
Priority:
Normal
[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 - <STDOUT> (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

Related to Backport186 - Backport #766: 'Not enough space' error on windowsRejectedActions

History

#1

Updated by konung (Nick Gorbikoff) over 10 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

#2

Updated by rogerdpack (Roger Pack) over 10 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

#3

Updated by usa (Usaku NAKAMURA) over 10 years ago

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

=begin
Applied in changeset r21903.
=end

#4

Updated by usa (Usaku NAKAMURA) over 10 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, redmine@ruby-lang.org 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
#include
#include

#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 usa@garbagecollect.jp

=end

#5

Updated by rogerdpack (Roger Pack) about 10 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

#6

Updated by d-snp (Tinco Andringa) almost 10 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

#7

Updated by usa (Usaku NAKAMURA) almost 10 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, redmine@ruby-lang.org 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 usa@garbagecollect.jp

=end

#8

Updated by usa (Usaku NAKAMURA) almost 10 years ago

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

=begin

=end

#9

Updated by yugui (Yuki Sonoda) almost 10 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

#10

Updated by rogerdpack (Roger Pack) over 8 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

Also available in: Atom PDF