2009-05-15 26 views
32

Tôi đang mở nhiều tệp với fopen() trong VC++ nhưng sau một thời gian không thành công.Có giới hạn về số lượng tệp đang mở trong Windows

Có giới hạn về số lượng tệp bạn có thể mở đồng thời không?

+0

tôi cho rằng bạn có thể bắt đầu một trường hợp mới của mình (quá trình) sau 2048 file ... – Adam

+0

... hoặc có một thực thi riêng biệt mà không hoạt động tập tin của bạn mà phải mất một vị trí textfile như một paramete r (mỗi dòng có vị trí hoạt động và tệp) và hoạt động với 500 tệp một lúc. – Adam

+0

Tài nguyên luôn bị giới hạn (bất kể máy tính và hệ điều hành). Vì vậy, tất nhiên có một giới hạn. Câu hỏi hay hơn là cách truy vấn hoặc tăng giới hạn đó. –

Trả lời

50

Thư viện thời gian chạy C có giới hạn 512 cho số tệp có thể mở cùng một lúc. Cố gắng mở nhiều hơn số lượng mô tả tệp hoặc luồng tệp tối đa gây ra lỗi chương trình. Sử dụng _setmaxstdio để thay đổi số này. Thông tin thêm về điều này có thể được đọc here

Ngoài ra, bạn có thể phải kiểm tra xem phiên bản cửa sổ của bạn có hỗ trợ giới hạn trên mà bạn đang cố gắng đặt với _setmaxstdio hay không. Để biết thêm thông tin về _setmaxstdio séc here

Thông tin về đề tài này tương ứng với VS 2015 có thể được tìm thấy here

+0

Thú vị. Giới hạn này có áp dụng cho tệp thi hành không? Chủ đề? Thứ gì khác? – Les

+7

Ngoài ra: Không thể _setmaxstdio vượt quá 2048 tệp mở, ít nhất với CRT Windows hiện tại. Nếu bạn cần nhiều tệp mở hơn thế, bạn sẽ phải sử dụng CreateFile (http://msdn.microsoft.com/en-us/library/aa363858.aspx) và các hàm Win32 liên quan. Tuy nhiên, một thiết kế yêu cầu nhiều tệp đang mở có thể sai ... – ephemient

+0

Vì hàm POSIX-ish _open() cũng là một hàm CRT, điều này cũng áp dụng cho việc sử dụng hàm đó cũng như hàm stdio fopen(). –

7

Có các giới hạn tùy thuộc vào cấp truy cập bạn sử dụng khi mở tệp. Bạn có thể sử dụng _getmaxstdio để tìm các giới hạn và _setmaxstdio để thay đổi giới hạn.

+0

Đúng, nhưng cũng có giới hạn trong S.O. –

0

Có, có giới hạn.

Giới hạn phụ thuộc vào hệ điều hành và bộ nhớ khả dụng.

Trong D.O.S. cũ giới hạn là 255 tệp được mở đồng thời.

Trong Windows XP, giới hạn cao hơn (tôi tin rằng đó là 2.048 như được nêu bởi MSDN).

+0

Điều này nghe có vẻ giống như một giới hạn của thời gian chạy C và không phải của HĐH. Tôi cho rằng nếu bạn sử dụng win32 api trực tiếp, bạn có thể mở nhiều tập tin hơn. – CodesInChaos

3

Tôi không biết nơi Paulo nhận rằng số lượng từ .. Trong cửa sổ hệ điều hành NT dựa số lượng tập tin xử lý mở mỗi quá trình cơ bản bị giới hạn bởi bộ nhớ vật lý - nó chắc chắn trong hàng trăm ngàn.

+2

Sẽ khác nếu bạn đang sử dụng CRT, như được nêu trong OP. – Joe

10

Trong trường hợp bất kỳ ai khác không rõ ràng về giới hạn áp dụng, tôi tin rằng đây là giới hạn cho mỗi quy trình và không phải là toàn hệ thống.

Tôi vừa viết một chương trình thử nghiệm nhỏ để mở tệp cho đến khi tệp không thành công. Nó được 2045 tập tin trước khi thất bại (2045 + STDIN + STDOUT + STDERROR = 2048), sau đó tôi để mở và chạy một bản sao khác.

Bản sao thứ hai cho thấy cùng một hành vi, có nghĩa là tôi đã có ít nhất 4096 tệp được mở cùng một lúc.

10

Nếu bạn sử dụng thư viện POSIX C/C++ chuẩn với Windows, câu trả lời là "có", có giới hạn.

Tuy nhiên, thú vị là giới hạn được áp đặt bởi loại thư viện C/C++ mà bạn đang sử dụng.

Tôi bắt gặp chuỗi JIRA sau (http://bugs.mysql.com/bug.php?id=24509) từ MySQL. Họ đã đối phó với cùng một vấn đề về số lượng các tập tin mở.

Tuy nhiên, Paul DuBois giải thích rằng vấn đề một cách hiệu quả có thể được loại bỏ trong Windows bằng cách sử dụng ...

Win32 API cuộc gọi (CreateFile(), WriteFile(), và vân vân) và mặc định số lượng tệp mở tối đa đã được tăng lên 16384.Tối đa có thể được tăng thêm bằng cách bằng cách sử dụng tùy chọn --max-open-files = N tại khởi động máy chủ.

Một cách tự nhiên, bạn có thể có số lượng lớn các tệp mở bằng cách sử dụng kỹ thuật tương tự như kết nối cơ sở dữ liệu, nhưng điều đó sẽ ảnh hưởng nghiêm trọng đến hiệu suất.

Thật vậy, việc mở một số lượng lớn tệp có thể là thiết kế kém. Tuy nhiên, một số tình huống gọi đòi hỏi nó. Ví dụ, nếu bạn đang xây dựng một máy chủ cơ sở dữ liệu sẽ được hàng nghìn người dùng hoặc ứng dụng sử dụng, máy chủ nhất thiết sẽ phải mở một số lượng lớn các tệp (hoặc bị ảnh hưởng bởi việc sử dụng các kỹ thuật gộp bộ mô tả tập tin).

-1

Đến cùng một vấn đề, nhưng sử dụng Embarcadero C++ - Trình tạo RAD Studio 10.2. C-runtime điều mà dường như không cung cấp _getmaxstdio hoặc _setmaxstdio, nhưng một số macros và hạn chế mặc định của họ là thấp hơn nhiều so với những gì được nói ở đây cho runtimes khác:

stdio.h:

/* Number of files that can be open simultaneously 
*/ 
#if defined(__STDC__) 
#define FOPEN_MAX (_NFILE_) 
#else 
#define FOPEN_MAX (_NFILE_) 
#define SYS_OPEN (_NFILE_) 
#endif 

_nfile.h:

#if defined(_WIN64) 
#define _NFILE_ 512 
#else 
#define _NFILE_ 50 
#endif 
Các vấn đề liên quan