From 4854f40447a11bf6542ca399707192834e7e1dc6 Mon Sep 17 00:00:00 2001 From: Viktor Lofgren Date: Mon, 30 Jan 2023 09:22:10 +0100 Subject: [PATCH] Array library optimizations for sortLargeSpan --- .../util/array/delegate/ShiftedIntArray.java | 7 +++++ .../util/array/delegate/ShiftedLongArray.java | 9 ++++++ .../util/array/page/PagingIntArray.java | 17 +++++++++++ .../util/array/page/PagingLongArray.java | 28 +++++++++++++++++++ 4 files changed, 61 insertions(+) diff --git a/marginalia_nu/src/main/java/nu/marginalia/util/array/delegate/ShiftedIntArray.java b/marginalia_nu/src/main/java/nu/marginalia/util/array/delegate/ShiftedIntArray.java index b7dc343e..6694f7b2 100644 --- a/marginalia_nu/src/main/java/nu/marginalia/util/array/delegate/ShiftedIntArray.java +++ b/marginalia_nu/src/main/java/nu/marginalia/util/array/delegate/ShiftedIntArray.java @@ -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); diff --git a/marginalia_nu/src/main/java/nu/marginalia/util/array/delegate/ShiftedLongArray.java b/marginalia_nu/src/main/java/nu/marginalia/util/array/delegate/ShiftedLongArray.java index cc6386d6..b80a8da8 100644 --- a/marginalia_nu/src/main/java/nu/marginalia/util/array/delegate/ShiftedLongArray.java +++ b/marginalia_nu/src/main/java/nu/marginalia/util/array/delegate/ShiftedLongArray.java @@ -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); diff --git a/marginalia_nu/src/main/java/nu/marginalia/util/array/page/PagingIntArray.java b/marginalia_nu/src/main/java/nu/marginalia/util/array/page/PagingIntArray.java index 9fdbd21d..b5f9b48d 100644 --- a/marginalia_nu/src/main/java/nu/marginalia/util/array/page/PagingIntArray.java +++ b/marginalia_nu/src/main/java/nu/marginalia/util/array/page/PagingIntArray.java @@ -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 } } + + 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++) { diff --git a/marginalia_nu/src/main/java/nu/marginalia/util/array/page/PagingLongArray.java b/marginalia_nu/src/main/java/nu/marginalia/util/array/page/PagingLongArray.java index e7f0a983..1180126a 100644 --- a/marginalia_nu/src/main/java/nu/marginalia/util/array/page/PagingLongArray.java +++ b/marginalia_nu/src/main/java/nu/marginalia/util/array/page/PagingLongArray.java @@ -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 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)) {