mirror of
https://github.com/MarginaliaSearch/MarginaliaSearch.git
synced 2025-02-24 05: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 com.upserve.uppend.blobs.NativeIO;
|
||||||
import nu.marginalia.util.array.IntArray;
|
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.buffer.IntQueryBuffer;
|
||||||
import nu.marginalia.util.array.functional.IntBinaryIOOperation;
|
import nu.marginalia.util.array.functional.IntBinaryIOOperation;
|
||||||
import nu.marginalia.util.array.functional.IntIOTransformer;
|
import nu.marginalia.util.array.functional.IntIOTransformer;
|
||||||
@ -97,6 +98,12 @@ public class ShiftedIntArray implements IntArray {
|
|||||||
return delegate.isSorted(shift + start, shift + end);
|
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) {
|
public long search(int key) {
|
||||||
if (size < 128) {
|
if (size < 128) {
|
||||||
return linearSearch(key);
|
return linearSearch(key);
|
||||||
|
@ -3,6 +3,7 @@ package nu.marginalia.util.array.delegate;
|
|||||||
import com.upserve.uppend.blobs.NativeIO;
|
import com.upserve.uppend.blobs.NativeIO;
|
||||||
import nu.marginalia.util.array.LongArray;
|
import nu.marginalia.util.array.LongArray;
|
||||||
import nu.marginalia.util.array.algo.LongArraySearch;
|
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.buffer.LongQueryBuffer;
|
||||||
import nu.marginalia.util.array.functional.LongBinaryIOOperation;
|
import nu.marginalia.util.array.functional.LongBinaryIOOperation;
|
||||||
import nu.marginalia.util.array.functional.LongIOTransformer;
|
import nu.marginalia.util.array.functional.LongIOTransformer;
|
||||||
@ -106,6 +107,14 @@ public class ShiftedLongArray implements LongArray {
|
|||||||
return delegate.isSortedN(sz, shift + start, shift + end);
|
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) {
|
public long searchN(int sz, long key) {
|
||||||
if (size < 128) {
|
if (size < 128) {
|
||||||
return linearSearchN(sz, key);
|
return linearSearchN(sz, key);
|
||||||
|
@ -2,6 +2,7 @@ package nu.marginalia.util.array.page;
|
|||||||
|
|
||||||
import com.upserve.uppend.blobs.NativeIO;
|
import com.upserve.uppend.blobs.NativeIO;
|
||||||
import nu.marginalia.util.array.IntArray;
|
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.buffer.IntQueryBuffer;
|
||||||
import nu.marginalia.util.array.delegate.ReferenceImplIntArrayDelegate;
|
import nu.marginalia.util.array.delegate.ReferenceImplIntArrayDelegate;
|
||||||
import nu.marginalia.util.array.functional.IntBinaryIOOperation;
|
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 {
|
public void write(Path fileName) throws IOException {
|
||||||
try (var channel = (FileChannel) Files.newByteChannel(fileName, StandardOpenOption.CREATE, StandardOpenOption.WRITE)) {
|
try (var channel = (FileChannel) Files.newByteChannel(fileName, StandardOpenOption.CREATE, StandardOpenOption.WRITE)) {
|
||||||
for (int i = 0; i < pages.length; i++) {
|
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 com.upserve.uppend.blobs.NativeIO;
|
||||||
import nu.marginalia.util.array.LongArray;
|
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.buffer.LongQueryBuffer;
|
||||||
import nu.marginalia.util.array.delegate.ReferenceImplLongArrayDelegate;
|
import nu.marginalia.util.array.delegate.ReferenceImplLongArrayDelegate;
|
||||||
import nu.marginalia.util.array.functional.LongBinaryIOOperation;
|
import nu.marginalia.util.array.functional.LongBinaryIOOperation;
|
||||||
@ -439,6 +440,33 @@ public class PagingLongArray extends AbstractPagingArray<LongArrayPage, LongBuff
|
|||||||
defaults.mergeSortN(sz, start, end, tempDir);
|
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 {
|
public void write(Path fileName) throws IOException {
|
||||||
try (var channel = (FileChannel) Files.newByteChannel(fileName, StandardOpenOption.CREATE, StandardOpenOption.WRITE)) {
|
try (var channel = (FileChannel) Files.newByteChannel(fileName, StandardOpenOption.CREATE, StandardOpenOption.WRITE)) {
|
||||||
|
Loading…
Reference in New Issue
Block a user