Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione vivo X500 Pro Max: la fotografia mobile ha un nuovo protagonista
Recensione vivo X500 Pro Max: la fotografia mobile ha un nuovo protagonista
Il nuovo top di gamma vivo punta su un comparto fotografico particolarmente articolato, con un teleobiettivo da 200 megapixel e teleconvertitori esterni capaci di arrivare a 400 mm equivalenti. Lo abbiamo provato a Tenerife, mettendo alla prova fotocamere, prestazioni, autonomia e accessori. Ecco come si è comportato.
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à
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


Recensione vivo X500 Pro Max: la fotografia mobile ha un nuovo protagonista Recensione vivo X500 Pro Max: la fotografia mobi...
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...
Impara dai propri errori e si allena da ...
Google lancia il backup automatico delle...
AMD, spunta una Radeon RX 470 con quattr...
Furto da 6,3 miliardi di dollari a Binan...
Grok, limiti esauriti di colpo nel fine ...
REDMAGIC 12 Pro: con ventola e raffredda...
Windows 11 26H2 ora disponibile per tutt...
Gli Xiaomi 18 Pro sono pronti per l'Euro...
Phantom Blade Zero da record: nelle prim...
Il paradosso di Android 17: è l'u...
Linux cresce ancora tra gli utenti Steam...
Non solo iPhone e Mac: Apple dovrebbe la...
Milioni di box Android TV trasformate in...
La Germania pungola l'Europa e punta a q...
Recensione UGREEN HomeAgent: è ar...
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: 14:22.


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