Torna indietro   Hardware Upgrade Forum > Software > Programmazione

HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione
HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione
HONOR ha finalmente lanciato il suo nuovo flagship: Magic 8 Pro. Lo abbiamo provato a fondo in queste settimane e ve lo raccontiamo nella nostra recensione completa. HONOR rimane fedele alle linee della versione precedente, aggiungendo però un nuovo tasto dedicato all'AI. Ma è al suo interno che c'è la vera rivoluzione grazie al nuovo Snapdragon 8 Elite Gen 5 e alla nuova MagicOS 10
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata
Le webcam Insta360 Link 2 Pro e Link 2C Pro sono una proposta di fascia alta per chi cerca qualità 4K e tracciamento automatico del soggetto senza ricorrere a configurazioni complesse. Entrambi i modelli condividono sensore, ottiche e funzionalità audio avanzate, differenziandosi per il sistema di tracciamento: gimbal a due assi sul modello Link 2 Pro, soluzione digitale sul 2C Pro
Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza
Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza
Motorola edge 70 porta il concetto di smartphone ultrasottile su un terreno più concreto e accessibile: abbina uno spessore sotto i 6 mm a una batteria di capacità relativamente elevata, un display pOLED da 6,7 pollici e un comparto fotografico triplo da 50 MP. Non punta ai record di potenza, ma si configura come alternativa più pragmatica rispetto ai modelli sottili più costosi di Samsung e Apple
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: 11186
[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 timestarttimeendtimetotal;

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

        try {
            
// Creation of a new input stream
            
fis = new FileInputStreamfile );
            
ds  = new DataInputStreamfis );

            
// 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 0i<sizei++) {
                
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 0i<sizei++) {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 0i<sizei++) {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 0i<sizei++) {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: 11186
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


HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione HONOR Magic 8 Pro: ecco il primo TOP del 2026! L...
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata Insta360 Link 2 Pro e 2C Pro: le webcam 4K che t...
Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza Motorola edge 70: lo smartphone ultrasottile che...
Display, mini PC, periferiche e networking: le novità ASUS al CES 2026 Display, mini PC, periferiche e networking: le n...
Le novità ASUS per il 2026 nel settore dei PC desktop Le novità ASUS per il 2026 nel settore de...
Bentornati nel 2007: le memorie DDR3 rin...
Stellantis aderisce ad AI4I e Fondazione...
Google Pixel 10a: prime conferme sul pre...
ISRO potrebbe lanciare la capsula Gagany...
Un nuovo leak conferma dimensioni e novi...
Steam Machine: requisiti Verified piu' s...
NVIDIA GeForce RTX 5070 Ti fuori produzi...
Sony ha annunciato i nuovi giochi che en...
IBM Sovereign Core: la sovranità ...
Cerchi un'asciugatrice conveniente su Am...
Ayaneo Pocket Play arriverà in ri...
iPad Pro 11'' con chip M4 scende a 949€ ...
The Sims entra in una nuova era, ma l'ac...
Netflix, Disney o Prime Video: qual &egr...
Perplexity blocca la generazione di imma...
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: 01:40.


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