Limitierter Hashspeicher

Status
Nicht offen für weitere Antworten.

DocSnyder

Mitglied
Hallo,

Ich implementiere eine Applikation, die Zugriffe auf Webseiten vornimmt und diese mittels DOM-Schnittstelle verarbeitet. Dabei kommt es oft vor, dass dieselbe Webseite erneut referenziert wird. Um den Traffic etwas zu entlasten, möchte ich mittels Hashtable einen Puffer erzeugen, der mir URL-Document Paare speichert. Wenn ein Zugriff auf eine URL stattfindet, so soll überprüft werden, ob die URL schon als Schlüssel vorliegt, und wenn ja, soll das Document aus der Hashtable gelesen werden, wenn nich, wird mittels HttpClient die Source geholt, das Document neu erzeugt und zusammen mit seinem URL in die Hashtable eingefügt.

Das Problem ist der begrenzte Heap der JVM, also möchte ich die Größe der Hashtable beschränken. Kann man das ganze mit einem FIFO Queue verbinden, um "alte Seiten" wieder aus der Hashtable zu entfernen?

Wär schön, wenn jemand einen Tip, und viell.ein Codebeispiel hat.

Danke, Micha
 
S

SlaterB

Gast
also die Standardklassen Hashtable/ HashMap haben das wohl nicht,
aber für einfache Zwecke doch schnell gemacht:
if (size() > n) {
remove one old entry before inserting;
}
auch die Keys nebenbei in einer LinkedList/ Queue, also FIFO zu speichern, geht ja wie von selbst
(und nein, von mir zumindest kein Beispiel, sorry wenn ich dann nur blah blah und nix neues lieferere ;) )

wenn du aber noch lauter schickere Cache-Strategieren haben willst,
(Time-out, Häufigkeit der Nutzung)
dann brauchst du vielleicht irgendeine Cache-Library,
gibts bestimmt, kann aber nix konkretes nennen
 

DocSnyder

Mitglied
OK, ich hab das jetzt so gelöst:

Code:
import java.util.Hashtable;
import java.util.LinkedList;

public class URLBuffer
{
	private Hashtable<String, WebDocument> docBuf;
	private LinkedList<String> fifo;
	
	public URLBuffer()
	{
		this.docBuf = new Hashtable<String, WebDocument>();
		this.fifo = new LinkedList<String>();
	}
	
	public void insertDocument(WebDocument webDoc)
	{
		if(!docBuf.containsKey(webDoc.getUrl()))
		{
			docBuf.put(webDoc.getUrl(), webDoc);
			fifo.add(webDoc.getUrl());
			if(fifo.size() > 100)
			{
				String key = fifo.poll();
				docBuf.remove(key);
			}
		}
	}
	
	public WebDocument findDocument(String urlStr)
	{
		if(docBuf.containsKey(urlStr))
		{
			return docBuf.get(urlStr);
		}
		else
		{
			return null;
		}
	}
	
	public String getBufferSize()
	{
		return ("Buffersize : " + docBuf.size());
	}
	
}

mal schauen, obs funktioniert ;-)
Micha
 
S

SlaterB

Gast
allgemeiner Map-Tipp:

Code:
public WebDocument findDocument(String urlStr) 
   { 
      if(docBuf.containsKey(urlStr)) 
      { 
         return docBuf.get(urlStr); 
      } 
      else 
      { 
         return null; 
      } 
   }

im Trefferfall muss zweimal der Hash berechnet werden,
schneller, kürzer und das gleiche macht:
Code:
public WebDocument findDocument(String urlStr) 
   { 
         return docBuf.get(urlStr); 
   }


---------

falls du unterschiedlich große Dokumente hast und die eine Größe angeben,
könntest du mehr auf Speicherplatz als auf Anzahl abzielen,

du müstest nebenbei auch die Größe speichern (zweite LinkedList oder mehr Infos in der ersten LinkedList,
oder steht ja auch im WebDocument in der Map ;) ),
und evtl. mehrere Objekte entfernen, damit beim Einfügen einer großen Seite die Gesamtgröße nicht überschritten wird
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Threads Mergesort mit limitierter Threadanzahl Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben