Ich ging durch Parsing XML-Techniken und entschied mich, SAX über DOM-Parser zu verwenden. Die Daten, Millionen von XML-Dateien von jeweils fast 6KB. Ich benutze SAXparser.Parsing Millionen von XML-Dateien - Java
Ich Schleife über alle Dateien parser.parse (Datei, Handler) einzeln aufrufen, aber nach 100.000 bekomme ich einen Heap nicht genügend Speicherfehler. Als ich versuchte, meinen Heap zu löschen und zu lesen, sah ich viele Char-Arrays und Strings gespeichert.
Die Frage ist, wie kann ich durch Millionen von kleinen Dateien ohne Heap-Fehler analysieren.
import javax.xml.parsers.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import java.util.*;
import java.io.*;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author Ajinkya Jumbad
*/
public class dataset {
static List<String> cols;
public HashMap<String, HashMap> hm = new HashMap<>();
static int i =0;
dataset() {
String coln[] = {
"UID",
"Name",
"NationID",
"Born",
"Age",
"IntCaps",
"IntGoals",
"U21Caps",
"U21Goals",
"Height",
"Weight",
"AerialAbility",
"CommandOfArea",
"Communication",
"Eccentricity",
"Handling",
"Kicking",
"OneOnOnes",
"Reflexes",
"RushingOut",
"TendencyToPunch",
"Throwing",
"Corners",
"Crossing",
"Dribbling",
"Finishing",
"FirstTouch",
"Freekicks",
"Heading",
"LongShots",
"Longthrows",
"Marking",
"Passing",
"PenaltyTaking",
"Tackling",
"Technique",
"Aggression",
"Anticipation",
"Bravery",
"Composure",
"Concentration",
"Vision",
"Decisions",
"Determination",
"Flair",
"Leadership",
"OffTheBall",
"Positioning",
"Teamwork",
"Workrate",
"Acceleration",
"Agility",
"Balance",
"Jumping",
"LeftFoot",
"NaturalFitness",
"Pace",
"RightFoot",
"Stamina",
"Strength",
"Consistency",
"Dirtiness",
"ImportantMatches",
"InjuryProness",
"Versatility",
"Adaptability",
"Ambition",
"Loyalty",
"Pressure",
"Professional",
"Sportsmanship",
"Temperament",
"Controversy",
"PositionsDesc",
"Goalkeeper",
"Sweeper",
"Striker",
"AttackingMidCentral",
"AttackingMidLeft",
"AttackingMidRight",
"DefenderCentral",
"DefenderLeft",
"DefenderRight",
"DefensiveMidfielder",
"MidfielderCentral",
"MidfielderLeft",
"MidfielderRight",
"WingBackLeft",
"WingBackRight"};
cols = Arrays.asList(coln);
try {
File f = new File("C:\\Users\\Ajinkya Jumbad\\Desktop\\fmdata");
//File files[] = f.listFiles();
for (File file : f.listFiles()) {
//System.out.println(file.getAbsolutePath());
if (file.isFile()) {
parse p = new parse(file);
}
}
//savefile();
} catch (Exception ex) {
Logger.getLogger(dataset.class.getName()).log(Level.SEVERE, null, ex);
}
}
private void savefile() {
try {
String file_name = "dataset.csv";
FileWriter w = new FileWriter(file_name);
writecsv ws = new writecsv();
boolean first = true;
StringBuilder sb = new StringBuilder();
for (String key : cols) {
if (!first) {
sb.append(",");
}
sb.append(key);
first = false;
}
sb.append("\n");
w.append(sb.toString());
for (String uid : hm.keySet()) {
ws.writeLine(w, hm.get(uid));
}
w.close();
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
public class parse{
parse(File file){
try {
SAXParserFactory parserfac = SAXParserFactory.newInstance();
parserfac.setNamespaceAware(true);
SAXParser parser = parserfac.newSAXParser();
DefaultHandler handler = new DefaultHandler(){
HashMap<String, String> ht;
@Override
public void startDocument() {
ht = new HashMap<>();
}
@Override
public void startElement(String namespaceURI,
String localName,
String qName,
Attributes atts) {
if (atts.getValue("Value") != null && cols.contains(localName)) {
//System.out.println(localName);
String key = localName;
ht.put(key, atts.getValue("Value"));
}
}
@Override
public void endDocument() {
String uid = ht.get("UID");
hm.put(uid, ht);
dataset.i += 1;
if(dataset.i%100 == 0){
System.out.println(dataset.i);
}
}
@Override
public void characters(char ch[], int start, int length) throws SAXException {
}
};
parser.parse(file, handler);
} catch (Exception ex) {
Logger.getLogger(dataset.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
public static void main(String[] args) {
dataset ds = new dataset();
}
}
Was ist Ihre Frage? – Tavo
Ohne auf Ihren Code zu schauen, ist es schwierig, Ihnen zu helfen. Eine Vermutung wäre, dass Sie diese Dateien weiterhin öffnen, aber niemals schließen und Ressourcen freigeben. – alfasin
Haben Sie mit dem DOM-Parser versucht, wie Sie sagten, dass Sie Datei für Datei analysieren und jede Datei nur 6 KB groß ist? Versuchen xml Verbindungen zu schließen mein Code, um Speicher-Ressourcen – harshavmb