32

I wrote a simple code to test how many files may be open in python script:

for i in xrange(2000):
    fp = open('files/file_%d' % i, 'w')
    fp.write(str(i))
    fp.close()

fps = []
for x in xrange(2000):
    h = open('files/file_%d' % x, 'r')
    print h.read()
    fps.append(h)

and I get the exception:

IOError: [Errno 24] Too many open files: 'files/file_509'
5
  • on fedora 14 and python 2.7 I got this error on 1021 Commented Jul 21, 2011 at 10:44
  • 6
    @wiso, +stdin, stdout, stderr makes 1024 - where have I seen that number before? Commented Jul 21, 2011 at 10:55
  • 1
    You should use try..finally or with to safely close a file. To your problem: maybe you want to tell us what you are going to do because want your code does makes no sense at all for me. Commented Jul 21, 2011 at 11:33
  • @gnibber: ulimit -n gives me 1024. I think you need to count also /usr/lib64/python2.7/atexit.py and /home/xyz/.pystartup as opened files. Commented Jul 21, 2011 at 17:45
  • Were you to try this in another language on the same operating system, you'll quicky discover that this is not a Python limitation. Commented May 7, 2015 at 8:49

7 Answers 7

45

The number of open files is limited by the operating system. On linux you can type

ulimit -n

to see what the limit is. If you are root, you can type

ulimit -n 2048

now your program will run ok (as root) since you have lifted the limit to 2048 open files

Sign up to request clarification or add additional context in comments.

2 Comments

+1, i will add if you want to check the limit using a python code use import resource; print resource.getrlimit(resource.RLIMIT_NOFILE).
Apparently, you don't need to be root to change it (I just tried!)
15

I see same behavior on Windows when running your code. The limit exists from C runtime. You can use win32file to change the limit value:

import win32file

print win32file._getmaxstdio()

The above shall give you 512, which explains the failure at #509 (+stdin, stderr, stdout as others have already stated)

Execute the following and your code shall run fine:

win32file._setmaxstdio(2048)

Note that 2048 is the hard limit, though (hard limit of the underlying C Stdio). As a result, executing the _setmaxstdio with a value greater than 2048 fails for me.

2 Comments

to make this work, I first had to do this install: pip install pywin32
Also note that as of 2022, the C runtime libraries now support an upper limit of 8192 open files, not 2048. See Microsoft's documentation on the _setmaxstdio function.
12

To check change the limit of open file handles on Linux, you can use the Python module resource:

import resource

# the soft limit imposed by the current configuration
# the hard limit imposed by the operating system.
soft, hard = resource.getrlimit(resource.RLIMIT_NOFILE)
print 'Soft limit is ', soft 

# For the following line to run, you need to execute the Python script as root.
resource.setrlimit(resource.RLIMIT_NOFILE, (3000, hard))

On Windows, I do as Punit S suggested:

import platform

if platform.system() == 'Windows':
    import win32file
    win32file._setmaxstdio(2048)

1 Comment

I noticed I don't have to be root to run setrlimit in Ubuntu.
7

Most likely because the operating system has a limit for the number of files that an application can have open.

Comments

2

On Windows one can get or set the limit with the built-in ctypes library:

import ctypes
print("Before: {}".format(ctypes.windll.msvcrt._getmaxstdio()))
ctypes.windll.msvcrt._setmaxstdio(2048)
print("After: {}".format(ctypes.windll.msvcrt._getmaxstdio()))

Comments

0

Since this is not a Python problem, do this:

for x in xrange(2000):
    with open('files/file_%d' % x, 'r') as h:
        print h.read()

The following is a very bad idea.

fps.append(h)

2 Comments

Whether this is a bad idea or not depends on what you're doing. Even Guido himself uses this strategy of holding onto open files in a particular sorting algorithm: neopythonic.blogspot.com/2008/10/…
@S.Lott: Can you explain why you think fps.append(h) would be a bad idea (and which alternative would you suggest)?
-1

The append is needed so the garbage collector does not clean up and close the files

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.