Array library optimizations for sortLargeSpan

This commit is contained in:
Viktor Lofgren 2023-01-30 09:22:10 +01:00
parent c8f7a8cb69
commit 4854f40447
4 changed files with 61 additions and 0 deletions

View File

@ -2,6 +2,7 @@ package nu.marginalia.util.array.delegate;
import com.upserve.uppend.blobs.NativeIO;
import nu.marginalia.util.array.IntArray;
import nu.marginalia.util.array.algo.SortingContext;
import nu.marginalia.util.array.buffer.IntQueryBuffer;
import nu.marginalia.util.array.functional.IntBinaryIOOperation;
import nu.marginalia.util.array.functional.IntIOTransformer;
@ -97,6 +98,12 @@ public class ShiftedIntArray implements IntArray {
return delegate.isSorted(shift + start, shift + end);
}
public void sortLargeSpan(SortingContext ctx, long start, long end) throws IOException {
delegate.sortLargeSpan(ctx, start, end);
}
public long search(int key) {
if (size < 128) {
return linearSearch(key);

View File

@ -3,6 +3,7 @@ package nu.marginalia.util.array.delegate;
import com.upserve.uppend.blobs.NativeIO;
import nu.marginalia.util.array.LongArray;
import nu.marginalia.util.array.algo.LongArraySearch;
import nu.marginalia.util.array.algo.SortingContext;
import nu.marginalia.util.array.buffer.LongQueryBuffer;
import nu.marginalia.util.array.functional.LongBinaryIOOperation;
import nu.marginalia.util.array.functional.LongIOTransformer;
@ -106,6 +107,14 @@ public class ShiftedLongArray implements LongArray {
return delegate.isSortedN(sz, shift + start, shift + end);
}
public void sortLargeSpanN(SortingContext ctx, int sz, long start, long end) throws IOException {
delegate.sortLargeSpanN(ctx, sz, start, end);
}
public void sortLargeSpan(SortingContext ctx, long start, long end) throws IOException {
delegate.sortLargeSpan(ctx, start, end);
}
public long searchN(int sz, long key) {
if (size < 128) {
return linearSearchN(sz, key);

View File

@ -2,6 +2,7 @@ package nu.marginalia.util.array.page;
import com.upserve.uppend.blobs.NativeIO;
import nu.marginalia.util.array.IntArray;
import nu.marginalia.util.array.algo.SortingContext;
import nu.marginalia.util.array.buffer.IntQueryBuffer;
import nu.marginalia.util.array.delegate.ReferenceImplIntArrayDelegate;
import nu.marginalia.util.array.functional.IntBinaryIOOperation;
@ -272,6 +273,22 @@ public class PagingIntArray extends AbstractPagingArray<IntArrayPage, IntBuffer>
}
}
public void sortLargeSpan(SortingContext ctx, long start, long end) throws IOException {
if (partitioningScheme.isSamePage(start, end)) {
int sOff = partitioningScheme.getOffset(start);
int eOff = partitioningScheme.getEndOffset(start, end);
if (eOff > sOff) {
pages[partitioningScheme.getPage(start)].sortLargeSpan(ctx, sOff, eOff);
}
}
else {
defaults.sortLargeSpan(ctx, start, end);
}
}
public void write(Path fileName) throws IOException {
try (var channel = (FileChannel) Files.newByteChannel(fileName, StandardOpenOption.CREATE, StandardOpenOption.WRITE)) {
for (int i = 0; i < pages.length; i++) {

View File

@ -2,6 +2,7 @@ package nu.marginalia.util.array.page;
import com.upserve.uppend.blobs.NativeIO;
import nu.marginalia.util.array.LongArray;
import nu.marginalia.util.array.algo.SortingContext;
import nu.marginalia.util.array.buffer.LongQueryBuffer;
import nu.marginalia.util.array.delegate.ReferenceImplLongArrayDelegate;
import nu.marginalia.util.array.functional.LongBinaryIOOperation;
@ -439,6 +440,33 @@ public class PagingLongArray extends AbstractPagingArray<LongArrayPage, LongBuff
defaults.mergeSortN(sz, start, end, tempDir);
}
}
public void sortLargeSpanN(SortingContext ctx, int sz, long start, long end) throws IOException {
if (partitioningScheme.isSamePage(start, end)) {
int sOff = partitioningScheme.getOffset(start);
int eOff = partitioningScheme.getEndOffset(start, end);
if (eOff > sOff) {
pages[partitioningScheme.getPage(start)].sortLargeSpanN(ctx, sz, sOff, eOff);
}
}
else {
defaults.sortLargeSpanN(ctx, sz, start, end);
}
}
public void sortLargeSpan(SortingContext ctx, long start, long end) throws IOException {
if (partitioningScheme.isSamePage(start, end)) {
int sOff = partitioningScheme.getOffset(start);
int eOff = partitioningScheme.getEndOffset(start, end);
if (eOff > sOff) {
pages[partitioningScheme.getPage(start)].sortLargeSpan(ctx, sOff, eOff);
}
}
else {
defaults.sortLargeSpan(ctx, start, end);
}
}
public void write(Path fileName) throws IOException {
try (var channel = (FileChannel) Files.newByteChannel(fileName, StandardOpenOption.CREATE, StandardOpenOption.WRITE)) {