2016-05-18 5 views
0

大きな(-ish)テーブルをXMLに変換しようとしています。その目的のために、どのようにMkyong does hereに基づいてDOMパーサを使用しています。大きなSQLiteテーブルをXMLに変換する

これは小さなテーブルでうまく動作しますが、7つの列と約350万行のテーブルに問題があります。それだけで永遠にかかる。より良い方法を提案したり、コードを改善できる箇所を指摘してください。

Javaおよび/またはSQLite以外は使用できません。たぶん私は適切なキーワードで検索していないが、Googleはこれまでのところ何か良いものを出せなかった。

public class Export { 

public static void export() { 
    String select = "Select * FROM individuen ORDER BY ID"; 
    DBController dbc = DBController.getInstance(); 
    dbc.initDBConnection(); 

    try { 
     Statement stmt = DBController.connection.createStatement(); 
     ResultSet rs = stmt.executeQuery(select); 
     DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); 

     // root elements 
     Document doc = docBuilder.newDocument(); 
     Element rootElement = doc.createElement("individuen"); 
     doc.appendChild(rootElement); 

     while (rs.next()) { 
      Element person = doc.createElement("Person"); 
      rootElement.appendChild(person); 

      // set attribute to person element 
      Attr attr = doc.createAttribute("id"); 
      attr.setValue(Integer.toString(rs.getInt(1))); 
      person.setAttributeNode(attr); 

      Element geschlecht = doc.createElement("Geschlecht"); 
      geschlecht.appendChild(doc.createTextNode(Integer.toString(rs.getInt(2)))); 
      person.appendChild(geschlecht); 

      [...] 
     } 

     System.out.println("oooooooooooout"); 
     // write the content into xml file 
     TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
     Transformer transformer = transformerFactory.newTransformer(); 
     DOMSource source = new DOMSource(doc); 
     StreamResult result = new StreamResult(new File("file.xml")); 

     // Output to console for testing 
     // StreamResult result = new StreamResult(System.out); 

     transformer.transform(source, result); 

     System.out.println("Als XML exportiert!"); 

    } catch (ParserConfigurationException pce) { 
     pce.printStackTrace(); 
    } catch (TransformerException tfe) { 
     tfe.printStackTrace(); 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 
} 
} 
+1

実際には「書き込み専用」の完全なXML DOMを気にするのはなぜでしょうか。 XMLライブラリを忘れて、XMLを直接String操作で書き出します。あなたのコードはもう少し長くなりますが、書き出すだけで対話しない大量のデータをメモリに取り込んでいます。 – stdunbar

+1

多くのデータを扱っているので、DOMを使用しないように**お勧めします。それだけで十分なエフェクトではありません。 SAX/StAXを直接使用するか、InputStream(またはNIOが必要な場合はチャネル)を使用してXMLファイルを直接ビルドします。また、すべての作品を分割してxmlのセグメントを同時に書くこともできます(Fork/Joinフレームワークを試してみてください)。とにかく、xmlは大きなデータベースを格納するのに適していません。そのサイズ、管理能力、処理速度は、あなたの世界を本当に止めます。 – glee8e

答えて

0

あなたのヒントをありがとう、私はSAX/StAXと一緒に行きました、そして今はうまくいきます。同じようなものを探している人のためのコードの一部です:

public void export(Population pop) { 
    String select = "Select * FROM individuen ORDER BY ID"; 
    DBController dbc = DBController.getInstance(); 
    dbc.initDBConnection(); 

    XMLOutputFactory factory = XMLOutputFactory.newInstance(); 
    XMLStreamWriter writer; 

    try { 
     Statement stmt = DBController.connection.createStatement(); 
     ResultSet rs = stmt.executeQuery(select); 
     writer = factory.createXMLStreamWriter(new FileOutputStream("output.xml")); 

     // Creating the XML-Header 
     writer.writeStartDocument(); 
     // Root Element 
     writer.writeStartElement("individuen"); 
     while (rs.next()) { 

      // Element Person, encompasses the other Elements 
      writer.writeStartElement("Peron"); 
      writer.writeAttribute("ID", rs.getString(1)); 

      // Element Geschlecht 
      writer.writeStartElement("Geschlecht"); 
      writer.writeCharacters(rs.getString(2)); 
      writer.writeEndElement(); 

      // Element Alter 
      writer.writeStartElement("Alter"); 
      writer.writeCharacters(rs.getString(3)); 
      writer.writeEndElement(); 

      // Element Alter 
      writer.writeStartElement("Familienstand"); 
      writer.writeCharacters(rs.getString(4)); 
      writer.writeEndElement(); 

      // Element PartnerID 
      writer.writeStartElement("PartnerID"); 
      writer.writeCharacters(rs.getString(4)); 
      writer.writeEndElement(); 

      // Element Bildungsstand 
      writer.writeStartElement("Bildungsstand"); 
      writer.writeCharacters(rs.getString(5)); 
      writer.writeEndElement(); 

      // Closes Element Person 
      writer.writeEndElement(); 
     } 
     writer.writeEndDocument(); 
     writer.close(); 

    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (XMLStreamException e) { 
     e.printStackTrace(); 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 
関連する問題