Torna indietro   Hardware Upgrade Forum > Software > Programmazione

WoW Forever: la beta è stato uno dei momenti più alti della storia dei videogiochi, e non si ripeterà
WoW Forever: la beta è stato uno dei momenti più alti della storia dei videogiochi, e non si ripeterà
Un mondo affollato e vivo, personaggi destinati a sparire a fine test e nessuno a inseguire l'oggetto giusto. Beta e stress test di World of Warcraft: Forever hanno fatto emergere un roleplay spontaneo, tra danze a Goldshire e code ordinate ai PNG
Oracle AI World 2026: in Europa prima la sovranità, poi la sicurezza e solo dopo l'IA
Oracle AI World 2026: in Europa prima la sovranità, poi la sicurezza e solo dopo l'IA
In tre giorni a Las Vegas Oracle ha presentato agenti che eseguono il lavoro, l'alleanza con OpenAI e un cloud aperto agli acceleratori di tutti. Ma i clienti europei chiedono garanzie prima ancora delle funzionalità
DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort
DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort
Fino a 740 km WLTP con la batteria da 97,2 kWh, sospensioni che leggono la strada con una telecamera e un abitacolo da salotto parigino. La nuova DS N°7 raccoglie l'eredità della DS 7 e la porta, per la prima volta, nel mondo 100% elettrico. Ecco come è fatta, cosa offre e quanto costa.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 22-02-2009, 17:16   #1
s12a
Senior Member
 
L'Avatar di s12a
 
Iscritto dal: Jan 2008
Messaggi: 11348
[Java] Mi aiutate ad ottimizzare l'I/O questo breve programma?

Salve.
Premetto che non sono una cima quanto a programmazione, mi diletto semplicemente ogni tanto a creare qualche applicazione a me utile.

Ma passiamo al dunque. Ho creato un breve programma in Java da riga di comando che sostanzialmente fa le seguenti cose:

- Legge un file binario dalla struttura definita
- Inserisce tutti i valori in un array ed esegue alcune operazioni sopra di essi
- Riscrive tutti i valori nell'ordine in cui sono stati prelevati dal file di input in un file di output anch'esso binario

Il problema che ho e` che le operazioni di input/output con i file sono piuttosto lente. Tutto il processo di scrittura e lettura di circa 4 milioni di elementi impiega oltre un minuto di tempo su un Athlon X2 5200+ con hard disk Western Digital 6400AAKS, francamente mi sembra un po' troppo considerando che vorrei poter essere in grado di utilizzare agevolmente anche file 10 volte piu` grandi. La fase della manipolazione dei dati invece e` piuttosto veloce. Io ho il dubbio che il problema risieda nelle funzioni utilizzate, probabilmente non velocissime. Sono effettivamente quelle piu` semplici e le prime che ho trovato e che facevano al caso mio; magari esiste qualcosa di piu` ottimizzato ma meno intuitivo.

Allego qui il codice del programma. Per ragioni pratiche, visto che non ho intenzione di tenere segreto il codice, i commenti sono in inglese. Se avete qualche dubbio su qualche parte non esitate a chiedermi.

Non fate inoltre caso ad eventuali usanze da niubbo del linguaggio di programmazione o alla mancanza di controlli di integrita` dei dati o cose del genere. Il programma e` estremamente semplificato, assolutamente non completo, ed al momento mi interessa piu` che altro sapere se e` possibile aumentare la velocita` delle operazioni di I/O.

Codice PHP:
package qsaconverter;
import java.io.*;

public class 
Main {

    public static 
void main(String[] args) {
        
// Input file stream initialization
        
File file = new File(args[2]);
        
FileInputStream fis;
        
DataInputStream ds;

        
// Output file stream initialization
        
File fileout = new File(args[2] + ".bin");
        
FileOutputStream fos;
        
DataOutputStream out;

        
// Binary SAC files have a header of 632 bytes which is disregarded.
        // The rest of the file is composed of 32 bit floating point words.
        // Size is the number of elements we're going to read from the file
        
final int size = (int)((file.length()-632)/4);

        
// Creating an array as big as the number of elements contained in the input file
        
double temparray[] = new double[size];

        
double maxtemp = 0;
        
double sum = 0;
        
double volume = Double.parseDouble(args[0]);
        
double timestart, timeend, timetotal;

        
// Start time, for benchmarking purposes
        
timestart = System.currentTimeMillis();

        try {
            
// Creation of a new input stream
            
fis = new FileInputStream( file );
            
ds  = new DataInputStream( fis );

            
// Creation of a new output stream
            
fos = new FileOutputStream ( fileout );
            
out = new DataOutputStream ( fos );

            
System.out.println("- Loading " + size + " elements from \"" + file + "\" and finding maximum absolute value");
            
            
// Skipping the 632 bytes header (composed of 158 words of 4 bytes each)
            
ds.skipBytes(632);

            
// Loading floating point data words in the previously created array
            // Their number is already determinated by the "size" constant
            
for (int i = 0; i<size; i++) {
                
temparray[i] = ds.readFloat();

                
// Finding the maximum absolute value
                
if (Math.abs(temparray[i]) > maxtemp) {maxtemp = Math.abs(temparray[i]);}
            }

            
System.out.println("- Maximum absolute value: " + maxtemp);

            
// Calculating the array average value, if args[1] is less than 0
            
if (Double.parseDouble(args[1]) < 0) {
                for (
int i = 0; i<size; i++) {sum = sum + temparray[i];}
                
sum = sum / size;
                
System.out.println("- Average array value: " + sum);
            }

            
// If args[1] is greater than 0, the array average value is overridden to a custom value
            
else {
                
sum = Double.parseDouble(args[1]);
                
System.out.println("- Maximum absolute value overridden: " + sum);
            }

            
// Array values are vertically adjusted to zero and normalized to +/- peak volume
            
System.out.println("- Adjusting offset and normalizing maximum peak to +/- " + volume);
            for (
int i = 0; i<size; i++) {temparray[i] = (temparray[i] - sum)/maxtemp*volume;}

            
// The whole array of double values is finally dumped to a binary file
            
System.out.println("- Writing results to raw 64bit float audio file \"" + fileout + "\"");
            for (
int i = 0; i<size; i++) {out.writeDouble(temparray[i]);}

            
// Closing opened files
            
ds.close();
            
out.close();
        }
        catch (
IOException iof)  {System.out.println("- IO error: " + iof);}

        
// Elapsing processing time, for benchmarking purposes
        
timeend = System.currentTimeMillis();
        
timetotal = (timeend - timestart)/1000;

        
System.out.println("- Done in " + timetotal + " seconds. Please import in Audacity as RAW audio file");

    }
} 
Questo e` l'output da riga di comando con un file di relativamente piccole dimensioni:

Codice:
C:\Users\Enter\Desktop\sac>java -jar qSAConverter.jar 0.75 -1 C:\Users\Enter\Desktop\sac\IRIS_BudDataCenter.2009.53.0.0.0.AV.RSO..EHZ.SAC
- Loading 4068787 elements from "C:\Users\Enter\Desktop\sac\IRIS_BudDataCenter.2009.53.0.0.0.AV.RSO..EHZ.SAC" and finding maximum absolute value
- Maximum absolute value: 2048.0
- Average array value: -4.330911890939486
- Adjusting offset and normalizing maximum peak to +/- 0.75
- Writing results to raw 64bit float audio file "C:\Users\Enter\Desktop\sac\IRIS_BudDataCenter.2009.53.0.0.0.AV.RSO..EHZ.SAC.bin"
- Done in 71.583 seconds. Please import in Audacity as RAW audio file
Qui un file SAC binario di esempio compresso in formato zip di piccole dimensioni che potete utilizzare e convertire con il programma (da usare decompresso):

http://www.mediafire.com/?sharekey=8...21d66e282a0ee8
s12a è offline   Rispondi citando il messaggio o parte di esso
Old 22-02-2009, 17:38   #2
AnonimoVeneziano
Senior Member
 
L'Avatar di AnonimoVeneziano
 
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
Prova ad aggiungere una BufferedInputStream e una BufferedOutputStream a tutto e vedere se migliori la situazione.

In pratica l'aggiungi tra la FileInputStream e la DataInputStream
__________________
GPU Compiler Engineer
AnonimoVeneziano è offline   Rispondi citando il messaggio o parte di esso
Old 22-02-2009, 17:48   #3
s12a
Senior Member
 
L'Avatar di s12a
 
Iscritto dal: Jan 2008
Messaggi: 11348
Quote:
Originariamente inviato da AnonimoVeneziano Guarda i messaggi
Prova ad aggiungere una BufferedInputStream e una BufferedOutputStream a tutto e vedere se migliori la situazione.

In pratica l'aggiungi tra la FileInputStream e la DataInputStream
Grazie mille per la dritta!
Il buffered stream ha fatto miracoli, con un file da 797916 elementi il tempo di esecuzione e` passato da circa 14 secondi a 0.184 secondi!
Quello dell'esempio a fine post da oltre 4 milioni di elementi e` passato da 71.583 secondi a 1.127 secondi
s12a è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


WoW Forever: la beta è stato uno dei momenti più alti della storia dei videogiochi, e non si ripeterà WoW Forever: la beta è stato uno dei mome...
Oracle AI World 2026: in Europa prima la sovranità, poi la sicurezza e solo dopo l'IA Oracle AI World 2026: in Europa prima la sovrani...
DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort DS N°7 E-Tense: il SUV premium made in Melfi...
Recensione Samsung Galaxy Tab S12 Ultra: non chiamatelo tablet... è molto di più Recensione Samsung Galaxy Tab S12 Ultra: non chi...
Hyundai IONIQ 5 N, l'elettrica che finge di essere termica (e ci riesce da paura) Hyundai IONIQ 5 N, l'elettrica che finge di esse...
Il razzo spaziale New Glenn di Blue Orig...
La Cina si prepara al primo lancio orbit...
Sale LAN, la Manovra 2027 introduce una ...
11 prezzi imperdibili in Amazon: non sol...
Giù i prezzi di Xiaomi 17T e Xiao...
Una tassa di 5,5 centesimi su ogni gigab...
Vuoi clonare un videogioco con l'IA? Cla...
Furto da 6,3 miliardi di dollari, Binanc...
Gli USA dipendono dai robot stranieri: T...
Volkswagen non ha più soldi per l...
Telescopio spaziale Hubble: la NASA cerc...
Più sottile e potente: le nuove i...
Il JPL estende la vita operativa della s...
DAZN Full è in offerta: tutta la ...
GTA 6 su PC potrebbe arrivare prima del ...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 22:51.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v