Skip to content

Commit

Permalink
modified assortment data structures
Browse files Browse the repository at this point in the history
git-svn-id: https://svn.berlios.de/svnroot/repos/yacy/trunk@148 6c8d7289-2bf4-0310-a012-ef5d649a1542
  • Loading branch information
orbiter committed May 22, 2005
1 parent 377fb07 commit e26ac60
Show file tree
Hide file tree
Showing 12 changed files with 243 additions and 125 deletions.
2 changes: 1 addition & 1 deletion build.xml
Expand Up @@ -70,7 +70,7 @@
<property name="javacTarget" value="1.4"/>

<!-- Release Configuration -->
<property name="releaseVersion" value="0.374"/>
<property name="releaseVersion" value="0.375"/>
<property name="releaseFile" value="yacy_dev_v${releaseVersion}_${DSTAMP}.tar.gz"/>

<target name="init">
Expand Down
2 changes: 1 addition & 1 deletion htroot/Performance_p.java
Expand Up @@ -178,7 +178,7 @@ public static serverObjects respond(httpHeader header, serverObjects post, serve
prop.put("maxURLinWordCache", "" + switchboard.wordIndex.maxURLinWordCache());
prop.put("maxWaitingWordFlush", switchboard.getConfig("maxWaitingWordFlush", "180"));
prop.put("wordCacheMax", switchboard.getConfig("wordCacheMax", "10000"));
prop.put("singletonsSize", switchboard.wordIndex.singletonsSize());
prop.put("singletonsSize", switchboard.wordIndex.assortmentSizes()[0]);

// table thread pool settings
GenericObjectPool.Config crawlerPoolConfig = switchboard.cacheLoader.getPoolConfig();
Expand Down
2 changes: 1 addition & 1 deletion htroot/yacy/transferRWI.java
Expand Up @@ -107,7 +107,7 @@ public static serverObjects respond(httpHeader header, serverObjects post, serve
wordHash = estring.substring(0, p);
wordhashes[i] = wordHash;
entry = new plasmaWordIndexEntry(estring.substring(p));
switchboard.wordIndex.addEntries(plasmaWordIndexEntryContainer.instantContainer(wordHash, entry));
switchboard.wordIndex.addEntries(plasmaWordIndexEntryContainer.instantContainer(wordHash, System.currentTimeMillis(), entry));
urlHash = entry.getUrlHash();
if ((!(unknownURL.contains(urlHash))) &&
(!(switchboard.loadedURL.exists(urlHash)))) {
Expand Down
2 changes: 1 addition & 1 deletion makerelease.sh
Expand Up @@ -45,7 +45,7 @@
# Contributions and changes to the program code must be marked as such.

# define variables
version='0.374'
version='0.375'
datestr=`date +%Y%m%d`
#release='yacy_v'$version'_'$datestr
release='yacy_dev_v'$version'_'$datestr
Expand Down
17 changes: 17 additions & 0 deletions source/de/anomic/kelondro/kelondroMergeIterator.java
Expand Up @@ -43,6 +43,7 @@

import java.util.Iterator;
import java.util.Comparator;
import java.util.Set;

public class kelondroMergeIterator implements Iterator {

Expand Down Expand Up @@ -105,4 +106,20 @@ public Object next() {
public void remove() {
throw new java.lang.UnsupportedOperationException("merge does not support remove");
}

public static Iterator cascade(Set /*of*/ iterators, boolean up) {
// this extends the ability to combine two iterators
// to the abiliy of combining a set of iterators
if (iterators == null) return null;
if (iterators.size() == 0) return null;
return cascade(iterators.iterator(), up);
}

private static Iterator cascade(Iterator /*of*/ iiterators, boolean up) {
if (iiterators == null) return null;
if (!(iiterators.hasNext())) return null;
Iterator one = (Iterator) iiterators.next();
if (!(iiterators.hasNext())) return one;
return new kelondroMergeIterator(one, cascade(iiterators, up), up);
}
}
2 changes: 1 addition & 1 deletion source/de/anomic/plasma/plasmaSearch.java
Expand Up @@ -112,7 +112,7 @@ public int addPageIndex(URL url, String urlHash, Date urlModified, plasmaCondens
wordHash = plasmaWordIndexEntry.word2hash(word);
entry = new plasmaWordIndexEntry(urlHash, count, p++, 0, 0,
age, quality, language, doctype, true);
wordIndex.addEntries(plasmaWordIndexEntryContainer.instantContainer(wordHash, entry));
wordIndex.addEntries(plasmaWordIndexEntryContainer.instantContainer(wordHash, System.currentTimeMillis(), entry));
}
//System.out.println("DEBUG: plasmaSearch.addPageIndex: added " + condenser.getWords().size() + " words, flushed " + c + " entries");
return condenser.getWords().size();
Expand Down
4 changes: 2 additions & 2 deletions source/de/anomic/plasma/plasmaWordIndex.java
Expand Up @@ -76,8 +76,8 @@ public int wordCacheRAMSize() {
return ramCache.wordCacheRAMSize();
}

public int singletonsSize() {
return ramCache.singletonsSize();
public int[] assortmentSizes() {
return ramCache.assortmentsSizes();
}

public void setMaxWords(int maxWords) {
Expand Down
85 changes: 15 additions & 70 deletions source/de/anomic/plasma/plasmaWordIndexAssortment.java
Expand Up @@ -47,7 +47,7 @@
For each 'x' there is an assortment database, where 1<=x<=max
If a word appears on more than 'max' web pages, the corresponing url-list
is stored to some kind of back-end database which we consider as the
'slowes' option to save data.
'slowest' option to save data. This here is the fastest file-based.
*/

package de.anomic.plasma;
Expand Down Expand Up @@ -124,34 +124,21 @@ public plasmaWordIndexAssortment(File storagePath, int assortmentCapacity, int b
}
}

public record newRecord(plasmaWordIndexEntry entry, long creationTime) {
return new record(new plasmaWordIndexEntry[]{entry}, creationTime);
}

public record newRecord(plasmaWordIndexEntry[] entries, long creationTime) {
return new record(entries, creationTime);
}

public class record {
public plasmaWordIndexEntry[] entries;
public long creationTime;
public record(plasmaWordIndexEntry[] entries, long creationTime) {
this.entries = entries;
this.creationTime = creationTime;
}
}

public void store(String wordHash, record newRecord) {
public void store(String wordHash, plasmaWordIndexEntryContainer newContainer) {
// stores a word index to assortment database
// this throws an exception if the word hash already existed
//log.logDebug("storeAssortment: wordHash=" + wordHash + ", urlHash=" + entry.getUrlHash() + ", time=" + creationTime);
if (newContainer.size() != assortmentCapacity) throw new RuntimeException("plasmaWordIndexAssortment.store: wrong container size");
byte[][] row = new byte[this.bufferStructureLength][];
row[0] = wordHash.getBytes();
row[1] = kelondroRecords.long2bytes(1, 4);
row[2] = kelondroRecords.long2bytes(newRecord.creationTime, 8);
for (int i = 0; i < assortmentCapacity; i++) {
row[3 + 2 * i] = newRecord.entries[i].getUrlHash().getBytes();
row[4 + 2 * i] = newRecord.entries[i].toEncodedForm(true).getBytes();
row[2] = kelondroRecords.long2bytes(newContainer.updated(), 8);
Iterator entries = newContainer.entries();
plasmaWordIndexEntry entry;
for (int i = 0; i < assortmentCapacity; i++) {
entry = (plasmaWordIndexEntry) entries.next();
row[3 + 2 * i] = entry.getUrlHash().getBytes();
row[4 + 2 * i] = entry.toEncodedForm(true).getBytes();
}
byte[][] oldrow = null;
try {
Expand All @@ -168,50 +155,7 @@ public void store(String wordHash, record newRecord) {
if (oldrow != null) throw new RuntimeException("Store to assortment ambiguous");
}

/*
public record read(String wordHash) {
// returns a single word index from assortment database; returns null if index does not exist
//log.logDebug("readAssortment: wordHash=" + wordHash);
byte[][] row = null;
try {
row = assortments.get(wordHash.getBytes());
} catch (IOException e) {
log.logFailure("readAssortment/IO-error: " + e.getMessage() + " - reset assortment-DB");
e.printStackTrace();
resetDatabase();
} catch (kelondroException e) {
log.logFailure("readAssortment/kelondro-error: " + e.getMessage() + " - reset assortment-DB");
e.printStackTrace();
resetDatabase();
}
if (row == null) return null;
long creationTime = kelondroRecords.bytes2long(row[2]);
plasmaWordIndexEntry[] wordEntries = new plasmaWordIndexEntry[this.bufferStructureLength];
for (int i = 0; i < assortmentCapacity; i++) {
wordEntries[i] = new plasmaWordIndexEntry(new String(row[3 + 2 * i]), new String(row[4 + 2 * i]));
}
return new record(wordEntries, creationTime);
}
public void remove(String wordHash) {
// deletes a word index from assortment database
//log.logDebug("removeAssortment: wordHash=" + wordHash);
byte[][] row = null;
try {
row = assortments.remove(wordHash.getBytes());
} catch (IOException e) {
log.logFailure("removeAssortment/IO-error: " + e.getMessage() + " - reset assortment-DB");
e.printStackTrace();
resetDatabase();
} catch (kelondroException e) {
log.logFailure("removeAssortment/kelondro-error: " + e.getMessage() + " - reset assortment-DB");
e.printStackTrace();
resetDatabase();
}
}
*/

public record remove(String wordHash) {
public plasmaWordIndexEntryContainer remove(String wordHash) {
// deletes a word index from assortment database
// and returns the content record
byte[][] row = null;
Expand All @@ -229,12 +173,13 @@ public record remove(String wordHash) {
return null;
}
if (row == null) return null;
long creationTime = kelondroRecords.bytes2long(row[2]);
long updateTime = kelondroRecords.bytes2long(row[2]);
plasmaWordIndexEntry[] wordEntries = new plasmaWordIndexEntry[this.bufferStructureLength];
plasmaWordIndexEntryContainer container = new plasmaWordIndexEntryContainer(wordHash);
for (int i = 0; i < assortmentCapacity; i++) {
wordEntries[i] = new plasmaWordIndexEntry(new String(row[3 + 2 * i]), new String(row[4 + 2 * i]));
container.add(new plasmaWordIndexEntry[]{new plasmaWordIndexEntry(new String(row[3 + 2 * i]), new String(row[4 + 2 * i]))}, updateTime);
}
return new record(wordEntries, creationTime);
return container;
}

private void resetDatabase() {
Expand Down
127 changes: 127 additions & 0 deletions source/de/anomic/plasma/plasmaWordIndexAssortmentCluster.java
@@ -0,0 +1,127 @@
// plasmaWordIndexAssortmentCluster.java
// -------------------------------------
// part of YACY
// (C) by Michael Peter Christen; mc@anomic.de
// first published on http://www.anomic.de
// Frankfurt, Germany, 2005
// last major change: 20.5.2005
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// Using this software in any meaning (reading, learning, copying, compiling,
// running) means that you agree that the Author(s) is (are) not responsible
// for cost, loss of data or any harm that may be caused directly or indirectly
// by usage of this softare or this documentation. The usage of this software
// is on your own risk. The installation and usage (starting/running) of this
// software may allow other people or application to access your computer and
// any attached devices and is highly dependent on the configuration of the
// software which must be done by the user of the software; the author(s) is
// (are) also not responsible for proper configuration and usage of the
// software, even if provoked by documentation provided together with
// the software.
//
// Any changes to this file according to the GPL as documented in the file
// gpl.txt aside this file in the shipment you received can be done to the
// lines that follows this copyright notice here, but changes must not be
// done inside the copyright notive above. A re-distribution must contain
// the intact and unchanged copyright notice.
// Contributions and changes to the program code must be marked as such.

/*
An assortment-cluster is a set of assortments.
Each one carries a different number of URL's
*/

package de.anomic.plasma;

import java.io.File;
import java.util.*;
import de.anomic.kelondro.*;
import de.anomic.server.serverLog;

public final class plasmaWordIndexAssortmentCluster {

// class variables
private File assortmentsPath;
private int clusterCapacity;
private serverLog log;
private plasmaWordIndexAssortment[] assortments;
private long completeBufferSize;

public plasmaWordIndexAssortmentCluster(File assortmentsPath, int clusterCapacity, int bufferkb, serverLog log) {
// set class variables
if (!(assortmentsPath.exists())) assortmentsPath.mkdirs();
this.clusterCapacity = clusterCapacity;
this.completeBufferSize = bufferkb * 1024;
this.log = log;
this.assortments = new plasmaWordIndexAssortment[clusterCapacity];

// initialize cluster
for (int i = 0; i < clusterCapacity; i++) {
assortments[i] = new plasmaWordIndexAssortment(assortmentsPath, i + 1, (int) completeBufferSize / clusterCapacity, log);
}
}

public plasmaWordIndexEntryContainer storeTry(String wordHash, plasmaWordIndexEntryContainer newContainer) {
// this tries to store the record. If the record does not fit, or a same hash already
// exists and would not fit together with the new record, then the record is deleted from
// the assortmen(s) and returned together with the newRecord.
// if storage was successful, NULL is returned.
if (newContainer.size() > clusterCapacity) return newContainer; // it will not fit
plasmaWordIndexEntryContainer buffer;
for (int i = 0; i < clusterCapacity; i++) {
buffer = assortments[i].remove(wordHash);
if (buffer != null) newContainer.add(buffer);
if (newContainer.size() > clusterCapacity) return newContainer; // it will not fit
}
// we collected all records and the result will fit somewhere..
assortments[newContainer.size() - 1].store(wordHash, newContainer);
// return null to show that we have stored the new Record successfully
return null;
}

public plasmaWordIndexEntryContainer removeFromAll(String wordHash) {
// collect all records from all the assortments and return them
plasmaWordIndexEntryContainer buffer, record = new plasmaWordIndexEntryContainer(wordHash);
for (int i = 0; i < clusterCapacity; i++) {
buffer = assortments[i].remove(wordHash);
if (buffer != null) record.add(buffer);
}
return record;
}

public Iterator hashConjunction(String startWordHash, boolean up) {
HashSet iterators = new HashSet();
for (int i = 0; i < clusterCapacity; i++) iterators.add(assortments[i].hashes(startWordHash, up, true));
return kelondroMergeIterator.cascade(iterators, up);
}

public int sizeTotal() {
int total = 0;
for (int i = 0; i < clusterCapacity; i++) total += assortments[i].size();
return total;
}

public int[] sizes() {
int[] sizes = new int[clusterCapacity];
for (int i = 0; i < clusterCapacity; i++) sizes[i] = assortments[i].size();
return sizes;
}

public void close() {
for (int i = 0; i < clusterCapacity; i++) assortments[i].close();
}

}

0 comments on commit e26ac60

Please sign in to comment.