Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > Java
You last visited: Today at 13:48

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



1GB Text Datei auslesen

Discussion on 1GB Text Datei auslesen within the Java forum part of the Coders Den category.

Reply
 
Old   #1
 
elite*gold: 13849
Join Date: Oct 2014
Posts: 673
Received Thanks: 219
1GB Text Datei auslesen

Hallo,
ich versuche nun seid knapp ner Woche eine *.txt Datei auszulesen die größer als 1GB ist. (ca. 1,2GB)

Ich habe ziemlich viel gegoogelt und verstehe auch natürlich woran es scheitert, es ist eine Log datei und die Lese ich ein, line by line, und wenn man halt 1000 von String objecten hat, dann füllt das eben den Speicher und es kommt zur OutOfMemory exception.

Nun gibt es einen weg wie ich diese Datei einlesen kann?
- Ich muss alle Strings in eine ArrayList<String> einfügen damit man sich die Logs im Programm auch ansehen kann .

Ich habe schon ziemlich vieles probiert, allerdings kommt mir nicht in den Sinn wie ich diese Daten verarbeiten kann.

MfG B.I.G
Lee Ki-Hwan is offline  
Thanks
1 User
Old 03/16/2015, 11:27   #2
 
elite*gold: 0
Join Date: Jan 2012
Posts: 759
Received Thanks: 416
Du kannst die maximale Größe vom Heap erhöhen (siehe z.B. ).
Besser ist es aber, wenn du einfach nicht die gesamte Datei auf einmal einliest. Möchten sich deine Benutzer wirklich 1 GB Logs anschauen? Das klingt nach ziemlich viel - sicher, dass Logs von vor einer Woche noch interessant sind?
dowhile is offline  
Thanks
1 User
Old 03/16/2015, 11:28   #3

 
snow's Avatar
 
elite*gold: 724
Join Date: Mar 2011
Posts: 10,479
Received Thanks: 3,318
Klingt so als müsstest du den Heap vergrößern, der einfachste Weg dürfte über die Argumente für die JVM sein:

e: zu spät
snow is offline  
Thanks
1 User
Old 03/16/2015, 12:03   #4
 
elite*gold: 13849
Join Date: Oct 2014
Posts: 673
Received Thanks: 219
Ja das ist ein Request-Log, und die Kunden möchten sich eben angucken was innerhalb 1 Woche verkauft wurde, welcher Mitarbeiter eingeloggt war zu der Zeit und etliches zeug mehr..

Muss man dann nicht den Heap auf jedem PC erhöhen damit meine Anwendung dann läuft?
Lee Ki-Hwan is offline  
Old 03/16/2015, 13:07   #5
 
elite*gold: 0
Join Date: Jan 2012
Posts: 759
Received Thanks: 416
Ja, das muss man. Du kannst den Benutzer aber nicht direkt deine jar starten lassen, sondern stattdessen irgendeine Starter-Datei mitliefern, die dann Java mit den richtigen Parametern startet.
Hast du schon überlegt bei so vielen Daten eine Datenbank anstatt einer Logdatei zu nutzen? Das wäre auch eine Möglichkeit.
dowhile is offline  
Thanks
3 Users
Old 03/16/2015, 13:47   #6
 
elite*gold: 13849
Join Date: Oct 2014
Posts: 673
Received Thanks: 219
Quote:
Originally Posted by dowhile View Post
Ja, das muss man. Du kannst den Benutzer aber nicht direkt deine jar starten lassen, sondern stattdessen irgendeine Starter-Datei mitliefern, die dann Java mit den richtigen Parametern startet.
Hast du schon überlegt bei so vielen Daten eine Datenbank anstatt einer Logdatei zu nutzen? Das wäre auch eine Möglichkeit.
Ja, das hat mir eben auch einer Empfohlen bei der Arbeit, allerdings muss dies Local sein und ohne Externe tools verlaufen, bin echt am verzweifeln wie ich das Lösen soll, hätte nicht gedacht das ich bei quasi so einer kleinigkeit an meine grenzen stöße, lol.

€: Zu der DB, ich muss ja den Request-Log irgendwie in eine Datenbank kriegen und das am besten auch per Programm, sonst sehe ich da auch wieder schwarz .
Lee Ki-Hwan is offline  
Old 03/16/2015, 14:05   #7
 
elite*gold: 0
Join Date: Jan 2012
Posts: 759
Received Thanks: 416
Quote:
Originally Posted by The Notorious B.I.G View Post
Ja, das hat mir eben auch einer Empfohlen bei der Arbeit, allerdings muss dies Local sein und ohne Externe tools verlaufen, bin echt am verzweifeln wie ich das Lösen soll, hätte nicht gedacht das ich bei quasi so einer kleinigkeit an meine grenzen stöße, lol.

€: Zu der DB, ich muss ja den Request-Log irgendwie in eine Datenbank kriegen und das am besten auch per Programm, sonst sehe ich da auch wieder schwarz .
Es gibt Datenbanken, für die du keine externe Programme brauchst (also nur eine Library einbinden musst). Auf Android nutzt man zum Beispiel sqlite, viele Java Anwendungen nutzen wohl (das habe ich noch nie verwendet).
Dann müsstest du die Log Datei bei Änderungen parsen (zum Beispiel mit regulären Ausdrücken, wenn die Logs einfach genug aufgebaut sind) und das neu hinzugekommene in die DB aufnehmen.
dowhile is offline  
Thanks
1 User
Old 03/16/2015, 15:19   #8
 
_Roman_'s Avatar
 
elite*gold: 0
Join Date: May 2010
Posts: 1,620
Received Thanks: 237
Also SQLite kann ich auch empfehlen, vor kurzem erst benutzt. Brauchst dafür lediglich die Library (in meinem Fall Qt) und dann kannst du bequem Befehle wie "SELECT * FROM table" etc. aus dem Programm ausführen.

Wie läuft das denn bei dir ab, wird der Log einfach nur einmal ausgegeben? Dann könntest du doch immer wieder den gleichen String benutzen, also quasi in einer Schleife die aktuelle Zeile im String speichern, ausgeben und dann so weiter. Bin mir nur nicht sicher, wie lang der Vorgang jedes Mal dauern würde, wenn man ihn wiederholt, da er ja die Datei nochmal auslesen würde. Oder rede ich hier gerade nur Mist :/
_Roman_ is offline  
Thanks
1 User
Old 03/16/2015, 17:26   #9
 
elite*gold: 0
Join Date: Nov 2010
Posts: 700
Received Thanks: 507
Eine Andere Möglichkeit wäre es die Datei nur Stückweise einzulesen. Also den Teil der gerade benötigt wird. Am besten die große Datei in mehrere kleinere Teilen und somit etwas Übersicht schaffen.

Also ich würde es folgendermaßen lösen:
Beim Programmstart wird die Datei geladen. Wenn sie eine bestimme Größe überschreitet (zb 100 MB) wird sie eingeteilt, das eine Datei maximal 100MB hat. Man kann sich ja dann einfach den ersten und letzten Log von der Datei speichern und demnach das ganze anzeigen lassen. Damit kann man schneller etwas suchen und man muss keine 1,2 GB in den Arbeitsspeicher laden
supercracker13 is offline  
Thanks
1 User
Old 03/17/2015, 09:28   #10
 
elite*gold: 13849
Join Date: Oct 2014
Posts: 673
Received Thanks: 219
Der Log wird ausgelesen und es wird in eine Listview gepackt. (IP - TIME - USER).
Ich habe mehrere Filter gemacht also Datum Filter, IP Filter, User Filter ect. pp.
Aber am Anfang wird eben der ganze Log angezeigt bzw. ausgelesen.
Einlesen -> ArrayList.
Und bei der Suchfunktion wird noch eine ArrayList angelegt die, dann das zu suchende beinhaltet..
Komplizierte scheissem aber werde mich heute mit SQLITE befassen, danke für die Zahlreichen antworten!
Lee Ki-Hwan is offline  
Old 03/17/2015, 15:12   #11


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
Quote:
Originally Posted by The Notorious B.I.G View Post
Der Log wird ausgelesen und es wird in eine Listview gepackt. (IP - TIME - USER).
Ich habe mehrere Filter gemacht also Datum Filter, IP Filter, User Filter ect. pp.
Aber am Anfang wird eben der ganze Log angezeigt bzw. ausgelesen.
Einlesen -> ArrayList.
Das ist ungeschickt. Such mal nach "lazy loading". Du solltest nur den Teil (und vielleicht ein bisschen mehr, damit das Scrollen flüssig abläuft) laden, der gerade benötigt wird. Der Benutzer kann (und will) sich ohnehin nicht ein ganzes Gigabyte an Logs auf einmal ansehen, sondern wird sie wohl eher nach und nach durchgehen oder nach bestimmten Kriterien filtern. Schon alleine, weil gar nicht alles gleichzeitig auf den Bildschirm passt.
Für eine begrenzte Anzeige die gesamten Daten im Speicher zu halten, ist Speicherverschwendung.
Eine Datenbank würde das Problem auch nicht lösen, wenn du am Ende wieder den gesamten Inhalt in einem Listview anzeigen willst.
MrSm!th is offline  
Thanks
1 User
Old 03/18/2015, 08:26   #12
 
elite*gold: 13849
Join Date: Oct 2014
Posts: 673
Received Thanks: 219
Waren ja erstmal auch nur 22Mb, da gings noch haha.

Eine Log-Zeile sieht wie folgt aus:
Code:
[Sun, 01 Feb 15 00:00:05 +0100]	0	GET	/apidevice/CENSORED/employeelist/key/CENSORED	multiuser=0	{"module":"apidevice","controller":"CENSORED","action":"employeelist","key":"CENSORED	"}
Ich werde mal einfach versuchen nur das was nötig ist zu Laden, dennoch mach ich mir sorgen wenn dies auch zuviel wird.

Das Problem ist ja selbst wenn ich es so machen will nur über einen Filter zu suchen, dann muss ich trotzdem durch die ganze Log-File iterieren um die ergebnisse zu sammeln und der BufferedReader macht das eben nicht mit.
Lee Ki-Hwan is offline  
Old 03/18/2015, 10:56   #13
 
NotEnoughForYou's Avatar
 
elite*gold: 0
Join Date: Jun 2010
Posts: 3,406
Received Thanks: 2,024
Wieso nicht auf Seiten splitten und dann immer nur den speziellen Teil des Files auslesen.
NotEnoughForYou is offline  
Old 03/18/2015, 16:14   #14
 
elite*gold: 13849
Join Date: Oct 2014
Posts: 673
Received Thanks: 219
Ich hab überlegt die Datei in 4 Teile aufzuteilen.
1 GB / 4 = 250mb pro Einheit.

Aber ich weiss nicht genau in was ich speichern soll, ArrayList ist glaub ich nicht so schlau.
Wäre für jede hilfe dankbar
Achja und mit der Datenkbank hab ichs auch versucht, wenn ich ein Thread mach blockiert die DB und ohne Thread dauert es viel zu lange, auch so dauerts ewig.
Lee Ki-Hwan is offline  
Old 03/18/2015, 21:56   #15
 
elite*gold: 0
Join Date: Nov 2010
Posts: 700
Received Thanks: 507
Also ich würde das nicht alles in ein array speichern, sondern mit ner schleife einfach die große datei abgehen und dann direkt die Ergebnisse in die kleine schreiben. Ein bisschen könnte man buffern (Vlt so 20 Stück, jeden selbst überlassen). Man muss dann einfach die neue datei im Auge behalten und zb nach jedem mal speichern überprüfen ob die Datei die maximale Größe übersteigt. Wenn ja wird ne neue Datei angelegt. Da mann das dann nach jedem speichern macht hat man auch nicht das Problem das ein teil abgeschnitten wird.

Dann zum filtern:
Da kann man dann einfach die kleinen Dateien durchforsten oder direkt die große (aber nicht alles laden, sondern immer nur ein bisschen)
Das filtern Dauer zwar eine zeit, aber bei 1,2gb ist das zu erwarten.
supercracker13 is offline  
Thanks
1 User
Reply


Similar Threads Similar Threads
Text aus einer Datei auslesen und angeben?
01/16/2015 - Web Development - 10 Replies
Hallo ich möchte gerne denn gesamten text meiner Seite aus einer einzigen Datei auslesen und angeben so das nur in dieser Datei immer was geändert werden muss. am besten sollte mann alles genau definieren können. Liebe Grüße
cmd text datei in java datei umwandeln
02/07/2013 - C/C++ - 2 Replies
hey leute weis jemand wie man eine text datei (editor datei) in eine java datei umwandel ich weiß das man das mit cmd machen kann (javav beehl aber wie kann ich auch die laufwerke zugreifen ? sry für die schlechte rechtschreibung LG
cmd text datei in java datei umwandeln
02/07/2013 - elite*gold Trading - 3 Replies
hey leute weis jemand wie man eine text datei (editor datei) in eine java datei umwandel ich weiß das man das mit cmd machen kann (javav beehl aber wie kann ich auch die laufwerke zugreifen ? sry für die schlechte rechtschreibung :D LG
VB 2010 Text Datei aus dem FTP Server Auslesen
08/18/2011 - Coding Tutorials - 8 Replies
Hallo Zusammen, Dieses TuT ist für anfänger die noch nich alle Grundlagen beherrschen. Aber fortgeschrittene können hier auch was lernen. In diesem TuT werde ich euch zeigen wie ihr ganz einfach Txt Dateien von eurem FTP server auf eure TextBox auslesen könnt. Was brauche ich dafür? 1. Einen Ftp Server ich empfehle : 000webhost.com Members Area
Javascript Text auslesen und Datei ausführen?
07/10/2011 - Web Development - 1 Replies
Hey Ich wollte mal wissen, ob und wenn ja wie Javascript in einem offenen Fenster nach bestimmtem Text suchen kann und wenn dieser Vorhanden is eine PHP Datei ausführt. Könnt ihr mir da helfen? Grüße



All times are GMT +1. The time now is 13:49.


Powered by vBulletin®
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2025 elitepvpers All Rights Reserved.