Hallo zusammen,
ich mahe folgendes:
Ich habe eine Datei mit mehr als einer Million float-Einträgen (bis hin zu 5 Mio. Einträgen). Diese Werte sollen nun in einen Vektor eingelesen werden. Während dessen wird mittels eines zweiten Threads ein Ladebalken, sowie die Anzahl der bereits eingelesenen floats angezeigt. Das Problem ist nur: Das ganze ist total langsam. :cry:
Für 100 geladene Einträge braucht das Programm 10 Sekunden -> für eine Million Einträge sind das ca. 27 Stunden (wenn ich mich net verrechnet hab ???:L ) !!! :?
Ich hoffe ihrt findet die Performancebremse!!!
PS: Ich poste jetzt den ganzen Code zur Übersicht. Das Problem liegt aber vermutlich entweder beim Einlesen selber (ist hier BufferedStream die beste Lösung?) oder bei den Threads von denen ich bislang kaum Ahnuing habe; dieser Teil ist von dem Tut von Beni abgekupfert).
class app (startet nur das Programm):
class AppWnd (ist für das Programmfenster verantwortlich):
class Reader (ist für das Einlesen der Datei zuständig):
Nochmal sorry für den vielen Code. Hoffe mir kann jemand helfen.
ich mahe folgendes:
Ich habe eine Datei mit mehr als einer Million float-Einträgen (bis hin zu 5 Mio. Einträgen). Diese Werte sollen nun in einen Vektor eingelesen werden. Während dessen wird mittels eines zweiten Threads ein Ladebalken, sowie die Anzahl der bereits eingelesenen floats angezeigt. Das Problem ist nur: Das ganze ist total langsam. :cry:
Für 100 geladene Einträge braucht das Programm 10 Sekunden -> für eine Million Einträge sind das ca. 27 Stunden (wenn ich mich net verrechnet hab ???:L ) !!! :?
Ich hoffe ihrt findet die Performancebremse!!!
PS: Ich poste jetzt den ganzen Code zur Übersicht. Das Problem liegt aber vermutlich entweder beim Einlesen selber (ist hier BufferedStream die beste Lösung?) oder bei den Threads von denen ich bislang kaum Ahnuing habe; dieser Teil ist von dem Tut von Beni abgekupfert).
class app (startet nur das Programm):
Code:
public class App
{
public App()
{
AppWnd frame = new AppWnd();
frame.setResizable(false);
frame.setVisible(true);
}
public static void main(String[] args)
{
new App();
}
}
class AppWnd (ist für das Programmfenster verantwortlich):
Code:
package app;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.lang.reflect.InvocationTargetException;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
public class AppWnd extends JFrame implements Runnable
{
private javax.swing.JButton buttonCancel;
private javax.swing.JButton buttonChoose;
private javax.swing.JButton buttonQuit;
private javax.swing.JLabel labelBonusCount;
private javax.swing.JLabel labelPercentage;
private javax.swing.JLabel labelPricesCount;
private javax.swing.JProgressBar progressBarCompute;
private javax.swing.JProgressBar progressBarLoad;
private Reader reader = new Reader();
public AppWnd()
{
super("Title");
initComponents();
this.centerWnd();
}
private void initComponents()
{
buttonChoose = new javax.swing.JButton();
labelPercentage = new javax.swing.JLabel();
labelBonusCount = new javax.swing.JLabel();
labelPricesCount = new javax.swing.JLabel();
buttonCancel = new javax.swing.JButton();
progressBarLoad = new javax.swing.JProgressBar();
progressBarCompute = new javax.swing.JProgressBar();
buttonQuit = new javax.swing.JButton();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
buttonChoose.setText("Datei auswählen");
buttonChoose.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
start();
}
});
labelPercentage.setText("n \\ a");
labelBonusCount.setText("Prämienanzahl: 0");
labelPricesCount.setText("Eingelesene Preise: 0");
buttonCancel.setText("Abbrechen");
buttonCancel.setEnabled(false);
buttonCancel.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
stop();
}
});
buttonQuit.setText("Beenden");
buttonQuit.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
System.exit(0);
}
});
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(buttonChoose, javax.swing.GroupLayout.DEFAULT_SIZE, 500, Short.MAX_VALUE)
.addComponent(progressBarLoad, javax.swing.GroupLayout.DEFAULT_SIZE, 500, Short.MAX_VALUE)
.addComponent(labelPricesCount, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 270, Short.MAX_VALUE)
.addComponent(progressBarCompute, javax.swing.GroupLayout.DEFAULT_SIZE, 500, Short.MAX_VALUE)
.addComponent(labelBonusCount, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 270, Short.MAX_VALUE)
.addComponent(labelPercentage, javax.swing.GroupLayout.DEFAULT_SIZE, 500, Short.MAX_VALUE)
.addComponent(buttonCancel, javax.swing.GroupLayout.DEFAULT_SIZE, 500, Short.MAX_VALUE)
.addComponent(buttonQuit, javax.swing.GroupLayout.DEFAULT_SIZE, 500, Short.MAX_VALUE))
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(buttonChoose)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(progressBarLoad, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(labelPricesCount)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(progressBarCompute, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(labelBonusCount)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(labelPercentage)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(buttonCancel)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(buttonQuit)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
pack();
}
private File recieveFile()
{
JFileChooser fc = new JFileChooser();
fc.setAcceptAllFileFilterUsed(false);
fc.setDialogTitle("Datei auswählen");
fc.setFileFilter(new javax.swing.filechooser.FileFilter()
{
public boolean accept(File f)
{
return f.isDirectory() || f.getName().toLowerCase().endsWith("");
}
public String getDescription()
{
return "Datei";
}
});
int state = fc.showSaveDialog(null);
if(state == JFileChooser.APPROVE_OPTION)
{
return new File(fc.getCurrentDirectory().getPath()+ "\\" + fc.getSelectedFile().getName());
}
return null;
}
protected void start()
{
new Thread(this).start();
buttonChoose.setEnabled(false);
buttonCancel.setEnabled(true);
buttonQuit.setEnabled(false);
}
protected void stop()
{
buttonCancel.setEnabled(false);
buttonChoose.setEnabled(true);
buttonQuit.setEnabled(true);
reader.setInterrupted(true);
}
public void run()
{
reader.setInterrupted(false);
reader.run(progressBarLoad, recieveFile(), labelPricesCount);
if(reader.isInterrupted())
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
progressBarLoad.setMinimum(0);
progressBarLoad.setMaximum(1);
progressBarLoad.setValue(0);
buttonChoose.setEnabled(true);
}
});
}
else
{
try
{
SwingUtilities.invokeAndWait(new Runnable()
{
public void run()
{
JOptionPane.showMessageDialog(null, "Algorithmus erfolgreich beendet.", "Beendet", JOptionPane.INFORMATION_MESSAGE);
}
});
}
catch(InterruptedException e)
{
e.printStackTrace();
}
catch(InvocationTargetException e)
{
e.printStackTrace();
}
}
}
public void centerWnd()
{
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
Dimension frameSize = this.getSize();
if(frameSize.height > screenSize.height)
{
frameSize.height = screenSize.height;
}
if(frameSize.width > screenSize.width)
{
frameSize.width = screenSize.width;
}
this.setLocation((screenSize.width - frameSize.width) / 2, (screenSize.height - frameSize.height) / 2);
}
}
class Reader (ist für das Einlesen der Datei zuständig):
Code:
package app;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;
import java.util.Vector;
import javax.swing.JLabel;
import javax.swing.JProgressBar;
import javax.swing.SwingUtilities;
public class Reader
{
// Membervariablen
//----------------
int lineCount;
private Vector<Float> vectorPrices = new Vector<Float>();
private JProgressBar status;
private boolean interrupted = false;
// Getter / Setter
//----------------
public int getLineCount(){return this.lineCount;}
public Vector<Float> getPricesVector(){return this.vectorPrices;}
public boolean isInterrupted()
{
return interrupted;
}
public void setInterrupted(boolean interrupt)
{
interrupted = interrupt;
}
// Memberfunktionen
//-----------------
public void run(JProgressBar progress, File file, JLabel labelPrices)
{
int current = 0;
status = progress;
status.setStringPainted(true);
establishLineCount(file);
setMinMax(0, lineCount);
BufferedReader br = null;
try
{
try
{
br = new BufferedReader(new FileReader(file));
}
catch(FileNotFoundException e)
{
e.printStackTrace();
}
while(current < lineCount && !isInterrupted())
{
try
{
Thread.sleep(100);
}
catch(InterruptedException e)
{
}
current++;
try
{
vectorPrices.add(Float.parseFloat(br.readLine()));
labelPrices.setText("Eingelesene Preise: " + current);
}
catch(NumberFormatException e)
{
e.printStackTrace();
}
catch(IOException e)
{
e.printStackTrace();
}
setValue(current);
}
}
finally
{
if(br != null)try{br.close();}catch(IOException e){e.printStackTrace();}
}
status = null;
}
private void setMinMax( final int min, final int max )
{
try{
SwingUtilities.invokeAndWait(new Runnable()
{
public void run()
{
status.setMinimum(min);
status.setValue(min);
status.setMaximum(max);
}
});
}
catch(Exception e)
{
}
}
private void setValue(final int value)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
try
{
status.setValue(value+1);
}
catch(NullPointerException ex)
{
}
}
});
}
public void establishLineCount(File file)
{
System.out.println("Reader - establishLineCount()");
LineNumberReader line = null;
System.out.println("Start");
try
{
try
{
line = new LineNumberReader(new FileReader(file));
}
catch(FileNotFoundException e)
{
e.printStackTrace();
}
try
{
while(line.readLine()!=null)
{
lineCount = line.getLineNumber();
}
}
catch(IOException e)
{
e.printStackTrace();
}
}
finally
{
try{line.close();}catch(IOException e){e.printStackTrace();}
}
System.out.println("Ende");
}
}
Nochmal sorry für den vielen Code. Hoffe mir kann jemand helfen.