2016-11-17 7 views
5

मैं एक प्रोग्राम लिख रहा हूं जो उच्च गति डेटा अधिग्रहण करेगा। अधिग्रहण कार्ड 6.8 जीबी/एस (यह पीसीआई 3 एक्स 8 पर है) पर चला सकता है। अभी मैं पाइथन के साथ प्राप्त अधिकतम लेखन गति को देखने के लिए रैम डिस्क पर स्ट्रीम करने की कोशिश कर रहा हूं।पायथन के साथ अधिकतम लेखन गति कैसे प्राप्त करें?

कार्ड मुझे 5-10 एमबी ब्लॉक देने जा रहा है, जिसे मैं कहीं और लिख सकता हूं।

मैंने कोड का यह टुकड़ा लिखा है, जो बाइनरी फ़ाइल में 10 गुना ब्लॉक 500 गुना लिखता है। मैं विंडोज 7 64-बिट पर एनाकोंडा 2 का उपयोग कर रहा हूं, और मैंने एनाकोंडा के त्वरित से प्रोफाइलर का उपयोग किया।

block = 'A'*10*1024*1024 
filename = "R:\\test" 
f = os.open(filename, os.O_CREAT| os.O_BINARY|os.O_TRUNC|os.O_WRONLY|os.O_SEQUENTIAL) 

p = profiler.Profile(signatures=False) 
p.enable() 
start = time.clock() 
for x in range(500): 
    os.write(f,block) 
transferTime_sec = time.clock() - start 
p.disable() 
p.print_stats() 

print('\nwrote %f MB' % (os.stat(filename).st_size/(1024*1024))) 

मैं एक रैम डिस्क (नि: \) पर इस परीक्षण किया है और मैं निम्नलिखित उत्पादन मिल गया:

enter image description here

तो मैं सोचा, मैं हो रही है कुछ 2.5 GB/s पर राम। जो खराब नहीं है लेकिन अभी भी अधिकतम रैम थ्रूपुट से दूर है, लेकिन संख्याएं सुसंगत हैं। तो कम थ्रूपुट एक समस्या है।

दूसरी समस्या यह है कि, जब मैं पीसीआई एसएसडी (जिसे मैंने 1090 एमबी/एस अनुक्रमिक लेखन पर किसी अन्य सॉफ़्टवेयर के साथ बेंचमार्क किया था) के साथ इस कोड का परीक्षण किया, तो यह तुलनीय आंकड़े देता है।

enter image description here

यह मैं लगता है कि यह कैशिंग और/या बफरिंग (?) और तो मैं बस को मापने नहीं कर रहा हूँ वास्तविक आईओ है बनाता है। मुझे यकीन नहीं है कि वास्तव में क्या चल रहा है क्योंकि मैं पाइथन के लिए बिल्कुल नया हूं।

तो मेरा मुख्य प्रश्न यह है कि अधिकतम लेखन गति कैसे प्राप्त करें, और एक साइड सवाल यह है कि मुझे इन नंबरों को क्यों मिल रहा है?

+0

मुझे आश्चर्य है, आपने 'ओपन()' के बजाय 'os.open()' क्यों उपयोग किया ?? –

+0

पुरुष सुनिश्चित करें कि कोई प्रक्रिया लिखने में हस्तक्षेप नहीं कर रही है, हां, मैं आपको विंडोज डिफेंडर देख रहा हूं। –

+0

@ShadyAtef फ़ाइल विशेषताओं पर अधिक नियंत्रण, संभावित IO –

उत्तर

0

मुझे नहीं पता कि आप अभी भी इस मुद्दे की देखभाल कर रहे हैं, लेकिन मुझे आपका प्रश्न दिलचस्प लगता है इसलिए मैंने इसे एक लिनक्स लैपटॉप पर आज़माया।

मैं अजगर 3.5 पर अपने कोड भाग गया और पाया है कि आप बफरिंग मुद्दा (मूल रूप से os.write समारोह से पहले सभी डेटा डिस्क पर लिखा गया है नहीं लौटेगा) से बचने के लिए os.O_SYNC ध्वज के लिए और साथ ही जरूरत है। मैं time.clock() को time.time() से भी प्रतिस्थापित करता हूं जो मुझे बेहतर परिणाम देता है।

import os 
import time 
import cProfile 

def ioTest(): 
    block = bytes('A'*10*1024*1024, 'utf-8') 
    filename = 'test.bin' 
    f = os.open(filename, os.O_WRONLY | os.O_CREAT | os.O_TRUNC | 
       os.O_SYNC) 
    start = time.time() 
    for x in range(500): 
     os.write(f,block) 
    os.close(f) 
    transferTime_sec = time.time() - start 
    msg = 'Wrote {:0f}MB in {:0.03f}s' 
    print(msg.format(os.stat(filename).st_size/1024/1024, 
        transferTime_sec)) 
cProfile.run('ioTest()') 

इसके अलावा, os.O_DIRECT झंडा है, जो डीएमए का उपयोग करें और बाधाओं से बचने जाएगा उपयोग के बारे में इस post बात।

import os 
import time 
import cProfile 
import mmap 

def ioTest(): 
    m = mmap.mmap(-1, 10*1024*1024) 
    block = bytes('A'*10*1024*1024, 'utf-8') 
    m.write(block) filename = 'test.bin' 
    f = os.open(filename, os.O_WRONLY | os.O_CREAT | os.O_TRUNC | 
       os.O_SYNC, os.O_DIRECT) 
    start = time.time() 
    for x in range(500): 
     os.write(f,m) 
    os.close(f) 
    transferTime_sec = time.time() - start 
    msg = 'Wrote {:0f}MB in {:0.03f}s.' 
    print(msg.format(os.stat(filename).st_size/1024/1024, 
        transferTime_sec)) 
cProfile.run('ioTest()') 

यह 40% से मेरी मशीन पर कम लेखन समय ... बुरा नहीं: मैं इसे अपने मशीन पर काम करने के लिए mmap मॉड्यूल का उपयोग किया था। मैंने os.O_SEQUENTIAL और os.O_BINARY का उपयोग नहीं किया जो मेरी मशीन पर उपलब्ध नहीं हैं।

[संपादित करें]: मैंने पाया कि site से os.O_DIRECT ध्वज का उपयोग कैसे करें, जो इसे बहुत अच्छी तरह से और गहराई से समझाता है। यदि आप पाइथन में प्रदर्शन और प्रत्यक्ष IO में रूचि रखते हैं तो मैं दृढ़ता से इसे पढ़ने की अनुशंसा करता हूं।

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