Hallo,
ich bin Java Anfänger. Ich habe vorher mit Python auf Symbian Handys programmiert. Nun bin ich auf das Android Handy G1 von Google umgestiegen und möchte mein Programm in Java umschreiben damit es auf Android läuft.
Dabei bin ich nun auf auf folgendes Problem gestoßen. Und zwar muss ich recht große Textdateien einlesen, verarbeiten und speichern. Jede Zeile ist dabei ein Datensatz. Diese Text Dateien sind teilweise 9.5Mb groß und können 57.000 Zeilen haben. Unter Python konnte ich diese Dateien ganz einfach als Liste einlesen, also liste = file.readlines(). Diese Python Liste hat im Hauptspeicher nicht viel mehr Platz belegt wie die Datei groß war. Und ich konnte mit selbgebauter binärer Suche und der eingebauten schnellen sort Methode blitzschnell auf alle Datensätze zugreifen.
Nun habe in in Java noch nicht den vollen Überblick und habe bisher nur die ArrayList entdeckt, die meine Wünsche erfüllen sollte. Zumindest das Verarbeiten geht genauso, wie mit den Python Listen. Direkter Zugriff per index auf die einzelnen Zeilen. Aber die ArrayListen scheinen mehr Speicherplatz im RAM zu belegen. So ist es mir nicht möglich die 9,5MB Datei zu laden, obwohl Android jedem Programm 16 MB zur Verfügung stellt. Das Problem is wohl, dass bei java Strings jeder Character mit 2 Byte gespeichert wird. Also werden die 9,5MB Daten in der ArrayList 19 MB groß und das ist zu viel für Android.
1. Frage wie kann ich die große Datei einlesen, so dass sie im Hauptspeicher nicht wesentlich mehr Speicher belegt? Ich muss die einzelnen Zeilen aber per index aufrufen können, Zeilen löschen oder hinzufügen und sortieren können.
2. Wie speichere ich diese Daten dann wieder möglichst schnell?
Angehängt habe ich den Code, wie ich bisher die Datei in eine Arraylist lade und wieder speicher. Die Speicher Methode funktioniert aber nicht korrekt. Alle Zeilenumbrüche gehen verloren und komische Steuerzeichen werden hinzugefügt. Außerdem dauert das Speichern mit über 30 Sekunden bei einer 3 MB Datei recht lange.
ich bin Java Anfänger. Ich habe vorher mit Python auf Symbian Handys programmiert. Nun bin ich auf das Android Handy G1 von Google umgestiegen und möchte mein Programm in Java umschreiben damit es auf Android läuft.
Dabei bin ich nun auf auf folgendes Problem gestoßen. Und zwar muss ich recht große Textdateien einlesen, verarbeiten und speichern. Jede Zeile ist dabei ein Datensatz. Diese Text Dateien sind teilweise 9.5Mb groß und können 57.000 Zeilen haben. Unter Python konnte ich diese Dateien ganz einfach als Liste einlesen, also liste = file.readlines(). Diese Python Liste hat im Hauptspeicher nicht viel mehr Platz belegt wie die Datei groß war. Und ich konnte mit selbgebauter binärer Suche und der eingebauten schnellen sort Methode blitzschnell auf alle Datensätze zugreifen.
Nun habe in in Java noch nicht den vollen Überblick und habe bisher nur die ArrayList entdeckt, die meine Wünsche erfüllen sollte. Zumindest das Verarbeiten geht genauso, wie mit den Python Listen. Direkter Zugriff per index auf die einzelnen Zeilen. Aber die ArrayListen scheinen mehr Speicherplatz im RAM zu belegen. So ist es mir nicht möglich die 9,5MB Datei zu laden, obwohl Android jedem Programm 16 MB zur Verfügung stellt. Das Problem is wohl, dass bei java Strings jeder Character mit 2 Byte gespeichert wird. Also werden die 9,5MB Daten in der ArrayList 19 MB groß und das ist zu viel für Android.
1. Frage wie kann ich die große Datei einlesen, so dass sie im Hauptspeicher nicht wesentlich mehr Speicher belegt? Ich muss die einzelnen Zeilen aber per index aufrufen können, Zeilen löschen oder hinzufügen und sortieren können.
2. Wie speichere ich diese Daten dann wieder möglichst schnell?
Angehängt habe ich den Code, wie ich bisher die Datei in eine Arraylist lade und wieder speicher. Die Speicher Methode funktioniert aber nicht korrekt. Alle Zeilenumbrüche gehen verloren und komische Steuerzeichen werden hinzugefügt. Außerdem dauert das Speichern mit über 30 Sekunden bei einer 3 MB Datei recht lange.
Java:
public void writeFile(final ArrayList<String> liste, String filename) {
try{
FileOutputStream fos = new FileOutputStream(filename);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject((ArrayList<String>) liste);
oos.flush();
fos.close();
}
catch(Exception e){}
}
public static ArrayList<String> loadFile(String fileName)
{
if ((fileName == null) || (fileName == ""))
throw new IllegalArgumentException();
String line;
ArrayList<String> file = new ArrayList<String>();
try
{
BufferedReader in = new BufferedReader(new FileReader(fileName));
if (!in.ready())
throw new IOException();
while ((line = in.readLine()) != null)
file.add(line);
in.close();
}
catch (IOException e)
{
System.out.println(e);
return null;
}
return file;
}
Zuletzt bearbeitet: