mirror of
https://github.com/MarginaliaSearch/MarginaliaSearch.git
synced 2025-02-23 21:18:58 +00:00
Array library optimizations for sortLargeSpan
This commit is contained in:
parent
c8f7a8cb69
commit
4854f40447
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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++) {
|
||||
|
@ -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)) {
|
||||
|
Loading…
Reference in New Issue
Block a user