Java I / O spotřebovává více zdrojů CPU

hlasů
0

Snažím se vytvořit 100 souborů pomocí FileOutputStream / BufferedOutputStream. Vidím využití procesoru je 100% po dobu 5 až 10 sekund. Adresář, který píši je prázdný. Jsem vytváření PDF souborů přes iText. Každý soubor má kolo 1 MB. Jsem běžící na Linuxu.

Jak mohu přepsat kód, takže mohu minimalizovat využití CPU?

Položena 27/08/2009 v 03:05
zdroj uživatelem
V jiných jazycích...                            


5 odpovědí

hlasů
8

Nehádejte: profil vaší žádosti.

V případě, že čísla ukazují, že hodně času tráví v / v zápisu volání, pak se podívejte na způsoby, jak dělat rychlejší I / O. Ale když většina času stráveného v formátování věci na výstupu (např iText rendering), pak je to, kde je třeba se zaměřit své úsilí.

Odpovězeno 27/08/2009 v 04:07
zdroj uživatelem

hlasů
4

Je to v adresáři, který již obsahuje velké množství souborů? Pokud ano, může také být jen vidět trest za to, že velké množství souborů v adresáři - to se výrazně liší od operačního systému a souborového systému.

Jinak, co to vlastně dělá, když jste vytváření souborů? Odkud data pocházejí? Jsou velké soubory? Jedna věc, kterou budete chtít udělat, je pokusit se zápisem na ByteArrayOutputStreammísto - tímto způsobem můžete vidět, kolik aktivity je vzhledem k systému souborů a kolik je to, jak jste získání / zápisu dat.

Odpovězeno 27/08/2009 v 03:10
zdroj uživatelem

hlasů
2

Je to dlouhý záběr odhad, ale i v případě, že používáte vyrovnávací proudy se ujistil, že nejste psaní ven jeden bajt najednou.

.read(int)A .write(int)metody jsou CPU zabijáci. Ty by měly být pomocí .read(byte[]...)i .write(byte[], int, int)pro jistý.

Odpovězeno 27/08/2009 v 03:45
zdroj uživatelem

hlasů
0

Soubor 1megabajt psát je dostatečně velký, aby použít java.nioFileChannel a vidět velké zlepšení výkonu nad java.io. Přepsat svůj kód, a změřit agaist staré věci. I předpovídají zlepšení 2x minimálně.

Odpovězeno 27/08/2009 v 12:19
zdroj uživatelem

hlasů
0

Jsi nepravděpodobné, že by bylo možné snížit zatížení procesoru pro svůj úkol, a to zejména v systému Windows. Java v systému Linux nepodporuje asynchronní soubor I / O, to však může vážně zkomplikovat svůj kód. Mám podezření, že jste se systémem Windows, jako soubor I / O obvykle trvá mnohem více času na Windows než to dělá na Linuxu. Dokonce jsem slyšel o zlepšení spuštěním Java v Linuxu VM v systému Windows.

Podívejte se na vaší Správce úloh při spuštění procesu, a zapněte Show pro jádro Times . Časový CPU strávil v uživatelském prostoru může být obecně optimalizována, ale čas CPU v prostoru jádra mohou být zpravidla pouze snížit o zefektivnit volání.

  • Aktualizace -

JSR 203 konkrétně řeší potřebu asynchronním, multiplexní, bodový / shromáždit soubor IO:

Multiplexní, non-blokování zařízení představil JSR-51 vyřešena velká část tohoto problému pro síťové sokety, ale neučinila tak pro souborového systému operace.

Až do JSR-203 se stane součástí Java, můžete získat pravdivý asynchronní IO s Apache MINA projektu na Linux.

Java NIO (1), která vám umožní provádět na základě Channel I / O. Jedná se o zlepšení výkonu, ale vaše jen dělá vyrovnávací paměti dat najednou, a ne skutečný asynchronní & multiplexní IO.

Odpovězeno 27/08/2009 v 03:15
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more