Newsgroup: it.comp.java
Titolo: Gestione dei file di grande dimensione

Salve a tutti,
vi riporto un problema che mi sta bloccando: "La gestione di un file
di un x formato di grandi dimensioni".
Per grandi dimensioni intendo qualcosa come 30 GB quando mi dice
bene.....
Il file ha una struttura pseudo-xml del tipo:
<DOCFILE>
     <items>
     </items>
</DOCFILE>
     .  .   .
<DOCFILE>
     <items>
     </items>
</DOCFILE>
Come vedete la prima idea che mi era venuta era quella di usare JDOM,
ma come sapete se il file non è ben formato, viene lanciata
un'eccezione.
Un'altra idea era quella di utilizzare java.nio, ma ha senso mappare
per esempio 20 GB in memoria????
Interessante sarebbe poter leggere come tokens :
<DOCFILE>
     <items>
     </items>
</DOCFILE>
uno alla volta...e poi poterci iterare all'interno per prelevare le
informazioni, e poi passare al prossimo docfile..
qualche idea???

 un'eccezione.
gestire 30 e passa giga in un dom sarebbe comunque una strada non
percorribile; devi necessariamente adattarti ad un parser stream-based
tipo stax, va bypassato il problema che non si tratta di un documento
well-formed ma non ci vedo grossi ostacoli.


E' ma è proprio li il mio problema..il fatto che non sia un file well-
formed  !!!
class BigFile implements Iterable<DocTrecPermalink>
{
    private BufferedReader _reader;
    public BigFile(String filePath) throws Exception
    {
	_reader = new BufferedReader(new FileReader(filePath));
    }
    public void Close()
    {
	try
	{
	    _reader.close();
	}
	catch (Exception ex) {}
    }
    public Iterator<DocTrecPermalink> iterator()
    {
	return new FileIterator();
    }
    private class FileIterator implements Iterator<DocTrecPermalink>
    {
	private String  _currentBlogNo=null;
	private StringBuffer _currentHtml=null;
	private DocTrecPermalink docpermalink=null;
	public boolean hasNext()
	{
		String _currentLine=null;
		boolean flag_NextHtmlstart= false;
		boolean flag_NextHtmlfine= false;
		boolean flag_doNogeted= false;
		boolean flag_DocNostart= false;
		boolean stop=false;
		//<html
		while( !stop  ){
			try
		    {
			// prelevo una riga
			_currentLine = _reader.readLine();
			////////////////////////////////////////////////////
			 if (_currentLine.contains("<DOC>")){
				 flag_DocNostart=true;
			}
			 else if (flag_DocNostart==true && (_currentLine.contains("<html")
|| _currentLine.contains("<html>")) && flag_NextHtmlstart==false ){
				 flag_NextHtmlstart=true;
				_currentHtml=new  StringBuffer ();
				while ( !flag_NextHtmlfine){
							if ( !(_currentLine.contains("</html>")) ){
								_currentHtml.append(_currentLine);
								_currentLine = _reader.readLine();
							}
							else {
								_currentHtml.append(_currentLine);
								 flag_NextHtmlfine=true;
							}
				}
			}
			else if(_currentLine.contains("<DOCNO>"  ) && flag_DocNostart==true
&& flag_doNogeted==false ){
				_currentBlogNo= _currentLine .substring(
						_currentLine.indexOf("<DOCNO>")+7,
						_currentLine.lastIndexOf("</DOCNO>") );
				flag_doNogeted=true;
			}
            else if(_currentLine.contains("</DOC>") ){
				flag_doNogeted=false;
				stop= true ;
				 flag_NextHtmlstart= false;
				 flag_NextHtmlfine=false;
				 flag_doNogeted= false;
				  flag_DocNostart= false;
			}
		    }
		    catch (Exception ex)
		    {
		    	_currentHtml=null;
		    	_currentBlogNo=null;
			ex.printStackTrace();
		    }
		}
		if(_currentHtml!=null && _currentBlogNo!=null  ){
			docpermalink= new
DocTrecPermalink(_currentBlogNo ,_currentHtml.toString());
			_currentBlogNo =null;
				_currentHtml=null;
		}
	    return docpermalink!= null;
	}
	public DocTrecPermalink next()
	{
	    return docpermalink;
	}
	/*
	 * (non-Javadoc)
	 * @see java.util.Iterator#remove()
	 */
	public void remove()
	{
	}
    }
}
Se vedi...al momento sto risolvendo il problema gestendo il tutto
così:
ma devo testare le performance....ricorda che sto lavorando con file
DI GROSSA DIMENSIONE... :(