2010-08-31 7 views
5

पर कॉल को पढ़ना मैं fgets का उपयोग कर टेक्स्ट की काफी बड़ी लाइनें (128K तक) पढ़ रहा हूं। मैं सर्वर पर स्विच करने से अत्यधिक संदर्भ दिखाई दे रही है, तो निम्न strace मैं देख रहा हूँ का उपयोग कर:fgets समस्या को लंबे समय तक पढ़ना() लिनक्स

read(3, "9005 10218 00840023102015 201008"..., 4096) = 4096 

अर्थात fgets एक समय में 4096 बाइट्स का हिस्सा पढ़ता है। read() पर कॉल करते समय कितने बड़े भाग fgets का उपयोग करने के लिए कोई तरीका है?

उत्तर

7

setvbuf प्रारंभ करने के लिए स्पष्ट जगह होगी।

+0

मुझे उदाहरण चाहिए एक * बड़ा * बफर हालांकि, लेकिन कुछ छोटे हिस्सों में पढ़ना जारी करता है। setvbuf के साथ मुझे बफर का अधिकतम आकार सेट करना होगा और पाठ बफर के आकार में जारी किए जाएंगे (उदाहरण के लिए 128k का बफर, 128k भाग में ऊतक पढ़ते हैं, जो वास्तव में 8192 बाइट्स पढ़ने से भी बदतर करने के लिए बाहर निकलता है , मेरे मामले में) – Anonym

2

समारोह fgets() stdio पैकेज का हिस्सा है, और इस तरह के रूप में यह एक तरीका है कि यह भी fgetc(), fscanf(), fread() और इसके आगे का उपयोग कर के साथ संगत है में बफ़र चाहिए (या नहीं) इनपुट स्ट्रीम। इसका मतलब है कि बफर स्वयं (यदि स्ट्रीम buffered है) FILE ऑब्जेक्ट की संपत्ति है।

चाहे कोई बफर है या नहीं, और यदि बफर किया गया है, तो बफर कितना बड़ा है, लाइब्रेरी को setvbuf() पर कॉल करके सुझाया जा सकता है।

लाइब्रेरी कार्यान्वयन में संकेतों को अनदेखा करने के लिए अक्षांश की उचित मात्रा है और यह सर्वोत्तम रूप से क्या सोचता है, लेकिन बफर जो आकार में दो की "उचित" शक्तियां स्वीकार किए जाते हैं। आपने देखा है कि डिफ़ॉल्ट 4096 था, जो इष्टतम से स्पष्ट रूप से छोटा है।

स्ट्रीम को वास्तविक फ़ाइल पर खोले जाने पर डिफ़ॉल्ट रूप से buffered किया जाता है। एक पाइप, फीफो, टीटीवी या किसी और चीज पर इसकी बफरिंग में संभावित रूप से अलग-अलग डिफ़ॉल्ट हैं।

संबंधित मुद्दे