2013-03-15 6 views
6

मैं जावा प्रोग्राम से 300 एम फाइलें बनाने की कोशिश कर रहा हूं, मैंने पुराने फ़ाइल एपीआई से नए जावा 7 एनओओ पैकेज में स्विच किया है, लेकिन नया पैकेज जा रहा है पुराने से भी धीमी है।जावा 7 का nio.file पैकेज नई फाइलें बनाने में uber धीमा है

मुझे पुरानी फ़ाइल एपीआई का उपयोग करते समय मैंने कम CPU उपयोग किया है, लेकिन मैं यह सरल कोड चला रहा हूं और मुझे 0.5 एमबाइट्स/सेक फ़ाइल ट्रांसफर दर मिल रही हैं और जावा से लिखने से एक पढ़ रहा है डिस्क और दूसरे को लिखना (लिखना डिस्क तक पहुंचने वाली एकमात्र प्रक्रिया है)।

Files.write(FileSystems.getDefault().getPath(filePath), fiveToTenKBytes, StandardOpenOption.CREATE); 

क्या यहां उचित थ्रूपुट प्राप्त करने की कोई उम्मीद है?


अद्यतन:

मैं बड़ी फ़ाइलों से 300 मिलियन 5-10k बाइट छवि फ़ाइलों को खोल रहा हूँ। मेरे पास 3 डिस्क, 1 स्थानीय और 2 SAN संलग्न हैं (सभी में बड़ी फ़ाइलों पर ~ 20MB/सेक की एक सामान्य थ्रूपुट दर है)।

मैंने इस कोड को भी आजमाया है जिसने गति को 2 एमबी/सेक थ्रूपुट से कम किया है (इन फ़ाइलों को अनपैक करने के लिए 9 दिन)।

ByteBuffer byteBuffer = ByteBuffer.wrap(imageBinary, 0, (BytesWritable)value).getLength()); 
FileOutputStream fos = new FileOutputStream(imageFile); 
fos.getChannel().write(byteBuffer); 
fos.close(); 

मैं स्थानीय डिस्क से पढ़ता हूं और सैन संलग्न डिस्क पर लिखता हूं। मैं एक हैडोप अनुक्रम फ़ाइल प्रारूप से पढ़ रहा हूं, हडूप आमतौर पर एक ही कोड का उपयोग करके इन फ़ाइलों को 20 एमबी/सेकेंड पर पढ़ने में सक्षम है।

उबर धीमेपन के अलावा, जगह से बाहर निकलने वाली एकमात्र चीज यह है कि मैं आईओ लिखने की तुलना में आईओओ को लगभग 2: 1 से अधिक पढ़ता हूं, हालांकि अनुक्रम फ़ाइल gziped है (छवियों को लगभग 1: 1 अनुपात मिलता है हालांकि), तो संपीड़ित फ़ाइल लगभग होना चाहिए। आउटपुट के साथ 1: 1।


2 अद्यतन

iostat मैं कुछ विषम संख्या को देखने को देखते हुए, हम यहाँ xvdf पर देख रहे हैं, मैं एक जावा प्रक्रिया xvdb से पढ़ रहे हैं और xvdf के लिए लिख और कोई ohter प्रक्रियाओं पर सक्रिय है xvdf

iostat -d 30 
Device:   tps kB_read/s kB_wrtn/s kB_read kB_wrtn 
xvdap1   1.37   5.60   4.13  168  124 
xvdb    14.80  620.00   0.00  18600   0 
xvdap3   0.00   0.00   0.00   0   0 
xvdf   668.50  2638.40  282.27  79152  8468 
xvdg   1052.70  3751.87  2315.47  112556  69464 

पढ़ता है पर xvdf 10x लेखन कर रहे हैं, कि अविश्वसनीय है।

fstab 
/dev/xvdf  /mnt/ebs1  auto defaults,noatime,nodiratime  0  0 
/dev/xvdg  /mnt/ebs2  auto defaults,noatime,nodiratime  0  0 
+0

ये फ़ाइलें कितनी बड़ी हैं? – parsifal

+0

@ पारसीफल "मैं 300 एम फाइलें बनाने की कोशिश कर रहा हूं [...]" – Puce

+2

मैंने पढ़ा है कि "मैं 300 मिलियन (या हजार) फाइलें बनाने की कोशिश कर रहा हूं" नहीं, "मैं एक फाइल बनाने की कोशिश कर रहा हूं आकार में 300 एमबी "(अन्यथा, क्यों" एम "का उपयोग करें और" एमबी "नहीं?)। – parsifal

उत्तर

1

मुझे लगता है कि आपकी धीमी गति नई फाइलें बनाने से आ रही है, वास्तविक हस्तांतरण नहीं। मेरा मानना ​​है कि फ़ाइल बनाना लिनक्स में एक सिंक्रोनस ऑपरेशन है: सिस्टम कॉल तब तक नहीं लौटाएगा जब तक फ़ाइल बनाई गई हो और निर्देशिका अद्यतन हो।

  • एक भी पाठक धागा के साथ कई लेखक धागे का प्रयोग करें: यह चीजों की एक जोड़ी आप कर सकते हैं पता चलता है। पाठक धागा स्रोत फ़ाइल से डेटा को byte[] में पढ़ेगा, फिर Runnable बनाएं जो इस सरणी से आउटपुट फ़ाइल लिखता है। threadpool का उपयोग बहुत सारे धागे के साथ करें - शायद 100 या अधिक - क्योंकि वे अपना अधिकांश समय पूरा करने के लिए creat के लिए प्रतीक्षा कर रहे होंगे। आपके पास मौजूद मेमोरी की मात्रा के आधार पर इस पूल की इनबाउंड कतार की क्षमता सेट करें: यदि आपकी फ़ाइलें आकार में 10k हैं, तो 1,000 की कतार क्षमता उचित लगती है (पाठकों को लेखकों से बहुत दूर जाने की अनुमति देने का कोई अच्छा कारण नहीं है , तो आप धागे की संख्या से दोगुनी क्षमता के साथ भी जा सकते हैं)।
  • एनआईओ की बजाय, मूल BufferedInputStream एस और BufferedOutputStreams का उपयोग करें। आपकी समस्या यहां सिस्कोल है, स्मृति की गति नहीं (एनआईओ कक्षाएं ढेर और ऑफ-हेप मेमोरी के बीच प्रतियों को रोकने के लिए डिज़ाइन की गई हैं)।

मुझे लगता है कि आप पहले से ही सभी फ़ाइलों को एक निर्देशिका में स्टोर करने का प्रयास नहीं करना चाहते हैं। या एक निर्देशिका में कुछ सौ से अधिक फ़ाइलों को भी स्टोर करें।

और एक अन्य विकल्प के रूप में, क्या आपने स्टोरेज के लिए एस 3 माना है? मुझे लगता है कि इसकी बाल्टी कुंजी वास्तविक निर्देशिकाओं की तुलना में कहीं अधिक कुशल हैं, और filesystem है जो आपको बाल्टी तक पहुंचने देता है जैसे कि वे फाइलें हैं (मैंने इसे स्वयं नहीं किया है)।

+0

मैंने 2 प्रक्रियाएं की हैं और डिस्क की गति नाटकीय रूप से गिरा दी गई है, लेकिन 2 प्रक्रियाओं की कुल 2 एमबी/सेकंड थी, थोड़ा बेहतर था, लेकिन ऐसा नहीं लगता कि एसिंक प्रक्रियाओं की स्थिति में मदद मिलेगी। एस 3 के लिए, यह मेरा पहला विचार था और यह एक विशाल विस्फोट के साथ विफल रहा। अपलोड करने के लिए 300 एम फाइलें प्राप्त करने की कोशिश कर रहे अपने तकनीक के साथ 2 सप्ताह ऑनलाइन असफल रहा और मुझे उपयोग शुल्क में 10k खर्च किया, भले ही यह पहली बार काम करता है (जो निश्चित रूप से नहीं होगा) आप फ़ाइलों को अपलोड करने के लिए 3k बात कर रहे हैं। उन छोटे $ 0.10/100 रखे चार्ज देखें, यह आपके लिए असली जल्दी आगे बढ़ता है !! –

+0

अब मैं बड़ी फाइलों (जो मैं शानदार तेज़ी से बना सकता हूं) की कोशिश कर रहा हूं, और बड़ी फ़ाइल में बाइट्स को पॉइंटर संग्रहीत कर रहा हूं। यह सब अब तक और अधिक आसानी से जा रहा है, और जैसा कि मैंने पढ़ा है, यह दृष्टिकोण फेसबुक का उपयोग करता है। जब मैं समाप्त करूँगा तो मैं इसकी सफलता पर पोस्ट करूंगा। –

+0

अंतिम परिणाम: 300 एम छोटी फाइलें न करें। हम एक और जटिल प्रणाली में जा रहे हैं जिसमें हम बाइनरी डेटा को बड़ी फाइलों में लोड करते हैं और बाइनरी डेटा को इंडेक्स ऑफसेट रखते हैं। हम एक बड़े विकल्प के रूप में बड़े mysql/myisam टेबल के साथ भी प्रयोग कर रहे हैं। –

2

अगर मैं अपना कोड सही तरीके से समझ, आप बंटवारे रहे हैं/छोटे-छोटे टुकड़ों में 300 फ़ाइलें ("fiveToTenKBytes") लेखन।

a Stream approach का उपयोग करने पर विचार करें।

यदि आप किसी डिस्क पर लिख रहे हैं, तो आउटपुटस्ट्रीम को BufferedOutputStream के साथ लपेटने पर विचार करें।

उदा। कुछ ऐसा:

try (BufferedOutputStream bos = new BufferedOutputStream(Files.newOutputStream(Paths.getPath(filePathString), StandardOpenOption.CREATE))){ 

... 

} 
+0

@ जोचिमसॉयर संपादन के लिए धन्यवाद, लेकिन स्टैक ओवरव्लो में विधि लिंक के साथ समस्याएं हैं ... – Puce

+0

मुझे पता है, लेकिन मैंने जो लिंक जोड़ा है वह ठीक काम करता है (कम से कम मेरे लिए)। और जो अभी खड़ा है वह आपको केवल 'फाइल' दस्तावेज में लाता है, क्योंकि इसमें जगह है। –

+0

आह, यह आईई 8 में एक मुद्दा प्रतीत होता है। फ़ायरफ़ॉक्स में यह काम करता है। – Puce

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