Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ Initializes `Lucene99AcceleratedHNSWVectorsWriter`
| --- | --- |
| `IOException` | IOException |

_Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/Lucene99AcceleratedHNSWVectorsWriter.java:89`_
_Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/Lucene99AcceleratedHNSWVectorsWriter.java:90`_

### addField

Expand All @@ -47,7 +47,7 @@ _Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/Lucene99Accelera

Add new field for indexing.

_Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/Lucene99AcceleratedHNSWVectorsWriter.java:131`_
_Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/Lucene99AcceleratedHNSWVectorsWriter.java:133`_

### flush

Expand All @@ -57,7 +57,7 @@ _Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/Lucene99Accelera

Build the indexes and writes it to the disk.

_Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/Lucene99AcceleratedHNSWVectorsWriter.java:221`_
_Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/Lucene99AcceleratedHNSWVectorsWriter.java:232`_

### mergeOneField

Expand All @@ -67,7 +67,7 @@ _Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/Lucene99Accelera

Write field for merging.

_Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/Lucene99AcceleratedHNSWVectorsWriter.java:363`_
_Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/Lucene99AcceleratedHNSWVectorsWriter.java:375`_

### finish

Expand All @@ -77,7 +77,7 @@ _Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/Lucene99Accelera

Called once at the end before close.

_Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/Lucene99AcceleratedHNSWVectorsWriter.java:372`_
_Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/Lucene99AcceleratedHNSWVectorsWriter.java:384`_

### close

Expand All @@ -87,7 +87,7 @@ _Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/Lucene99Accelera

Closes the resources.

_Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/Lucene99AcceleratedHNSWVectorsWriter.java:392`_
_Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/Lucene99AcceleratedHNSWVectorsWriter.java:404`_

### ramBytesUsed

Expand All @@ -97,6 +97,6 @@ _Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/Lucene99Accelera

Returns the memory usage of this object in bytes.

_Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/Lucene99AcceleratedHNSWVectorsWriter.java:402`_
_Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/Lucene99AcceleratedHNSWVectorsWriter.java:414`_

_Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/Lucene99AcceleratedHNSWVectorsWriter.java:55`_
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ Initializes `LuceneAcceleratedHNSWBinaryQuantizedVectorsWriter`
| --- | --- |
| `IOException` | IOException |

_Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/LuceneAcceleratedHNSWBinaryQuantizedVectorsWriter.java:79`_
_Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/LuceneAcceleratedHNSWBinaryQuantizedVectorsWriter.java:80`_

### addField

Expand All @@ -47,7 +47,7 @@ _Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/LuceneAccelerate

Add new field for indexing.

_Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/LuceneAcceleratedHNSWBinaryQuantizedVectorsWriter.java:127`_
_Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/LuceneAcceleratedHNSWBinaryQuantizedVectorsWriter.java:129`_

### flush

Expand All @@ -57,7 +57,7 @@ _Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/LuceneAccelerate

Build the indexes and writes it to the disk.

_Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/LuceneAcceleratedHNSWBinaryQuantizedVectorsWriter.java:220`_
_Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/LuceneAcceleratedHNSWBinaryQuantizedVectorsWriter.java:231`_

### mergeOneField

Expand All @@ -67,7 +67,7 @@ _Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/LuceneAccelerate

Write field for merging.

_Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/LuceneAcceleratedHNSWBinaryQuantizedVectorsWriter.java:305`_
_Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/LuceneAcceleratedHNSWBinaryQuantizedVectorsWriter.java:316`_

### finish

Expand All @@ -77,7 +77,7 @@ _Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/LuceneAccelerate

Called once at the end before close.

_Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/LuceneAcceleratedHNSWBinaryQuantizedVectorsWriter.java:336`_
_Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/LuceneAcceleratedHNSWBinaryQuantizedVectorsWriter.java:347`_

### close

Expand All @@ -87,7 +87,7 @@ _Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/LuceneAccelerate

Closes the resources.

_Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/LuceneAcceleratedHNSWBinaryQuantizedVectorsWriter.java:356`_
_Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/LuceneAcceleratedHNSWBinaryQuantizedVectorsWriter.java:367`_

### ramBytesUsed

Expand All @@ -97,6 +97,6 @@ _Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/LuceneAccelerate

Returns the memory usage of this object in bytes.

_Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/LuceneAcceleratedHNSWBinaryQuantizedVectorsWriter.java:365`_
_Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/LuceneAcceleratedHNSWBinaryQuantizedVectorsWriter.java:376`_

_Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/LuceneAcceleratedHNSWBinaryQuantizedVectorsWriter.java:57`_
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ Initializes `LuceneAcceleratedHNSWScalarQuantizedVectorsWriter`
| --- | --- |
| `IOException` | IOException |

_Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/LuceneAcceleratedHNSWScalarQuantizedVectorsWriter.java:89`_
_Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/LuceneAcceleratedHNSWScalarQuantizedVectorsWriter.java:90`_

### addField

Expand All @@ -47,7 +47,7 @@ _Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/LuceneAccelerate

Add new field for indexing.

_Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/LuceneAcceleratedHNSWScalarQuantizedVectorsWriter.java:136`_
_Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/LuceneAcceleratedHNSWScalarQuantizedVectorsWriter.java:138`_

### flush

Expand All @@ -57,7 +57,7 @@ _Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/LuceneAccelerate

Build the indexes and writes it to the disk.

_Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/LuceneAcceleratedHNSWScalarQuantizedVectorsWriter.java:247`_
_Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/LuceneAcceleratedHNSWScalarQuantizedVectorsWriter.java:258`_

### mergeOneField

Expand All @@ -67,7 +67,7 @@ _Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/LuceneAccelerate

Write field for merging.

_Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/LuceneAcceleratedHNSWScalarQuantizedVectorsWriter.java:330`_
_Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/LuceneAcceleratedHNSWScalarQuantizedVectorsWriter.java:341`_

### finish

Expand All @@ -77,7 +77,7 @@ _Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/LuceneAccelerate

Called once at the end before close.

_Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/LuceneAcceleratedHNSWScalarQuantizedVectorsWriter.java:361`_
_Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/LuceneAcceleratedHNSWScalarQuantizedVectorsWriter.java:372`_

### close

Expand All @@ -87,7 +87,7 @@ _Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/LuceneAccelerate

Closes the resources.

_Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/LuceneAcceleratedHNSWScalarQuantizedVectorsWriter.java:381`_
_Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/LuceneAcceleratedHNSWScalarQuantizedVectorsWriter.java:392`_

### ramBytesUsed

Expand All @@ -97,6 +97,6 @@ _Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/LuceneAccelerate

Returns the memory usage of this object in bytes.

_Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/LuceneAcceleratedHNSWScalarQuantizedVectorsWriter.java:390`_
_Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/LuceneAcceleratedHNSWScalarQuantizedVectorsWriter.java:401`_

_Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/LuceneAcceleratedHNSWScalarQuantizedVectorsWriter.java:56`_
45 changes: 5 additions & 40 deletions fern/pages/lucene_api/lucene-api-com-nvidia-cuvs-lucene-utils.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,41 +72,6 @@ an instance of CuVSMatrix

_Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/Utils.java:60`_

### createHostFloatMatrix

```java
static CuVSHostMatrix createHostFloatMatrix(List<float[]> data, int dimensions)
```

Builds a host-memory CuVSMatrix from a list of float vectors.

Copies vectors directly into native host memory without creating an intermediate \{@code
float[][]\} on the heap.

**Parameters**

| Name | Description |
| --- | --- |
| `data` | The float vectors |
| `dimensions` | The number of float elements in each vector |

**Returns**

a host-memory CuVSMatrix

_Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/Utils.java:88`_

### createHostByteMatrix

```java
static CuVSHostMatrix createHostByteMatrix(List<byte[]> data, int bytesPerVector)
```

Builds a host-memory CuVSMatrix from byte vectors without first materializing the list as an
intermediate `byte[][]`.

_Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/Utils.java:102`_

### createHostByteMatrixFromArray

```java
Expand All @@ -115,7 +80,7 @@ static CuVSHostMatrix createHostByteMatrixFromArray(byte[][] data, int bytesPerV

Builds a host-memory CuVSMatrix from a 2D byte array.

_Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/Utils.java:113`_
_Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/Utils.java:79`_

### nanosToMillis

Expand All @@ -135,7 +100,7 @@ A utility method to convert nanoseconds to milliseconds.

milliseconds

_Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/Utils.java:194`_
_Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/Utils.java:160`_

### cuVSResourcesOrNull

Expand All @@ -149,7 +114,7 @@ Creates an instance of CuVSResources.

an instance of CuVSResources

_Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/Utils.java:203`_
_Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/Utils.java:169`_

### handleThrowableWithIgnore

Expand All @@ -172,7 +137,7 @@ A utility method that conditionally ignores certain throwable objects
| --- | --- |
| `IOException` | |

_Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/Utils.java:231`_
_Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/Utils.java:197`_

### info

Expand All @@ -190,6 +155,6 @@ Utility to print info/debug messages via InfoStream.
| `component` | the name of the index writer |
| `msg` | the log message to push via the InfoStream |

_Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/Utils.java:245`_
_Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/Utils.java:211`_

_Source: `java/cuvs-lucene/src/main/java/com/nvidia/cuvs/lucene/Utils.java:23`_
13 changes: 13 additions & 0 deletions java/cuvs-lucene/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,19 @@ resources in a long-lived application. Class-level documentation is in the
Runnable examples of CAGRA-accelerated HNSW indexing, and of indexing and searching entirely on the GPU with
`CuVS2510GPUSearchCodec`, are in the [`examples/`](../../examples/java/cuvs-lucene) directory.

### Accelerated HNSW build memory

The float, binary-quantized, and scalar-quantized HNSW writers include their primary native host input
payload in the codec writer's `ramBytesUsed()` while filling the matrix, building the index, and
writing its graph. Enable Lucene diagnostics with `IndexWriterConfig.setInfoStream(System.out)` to
see `primary_host_input_bytes` messages identifying each segment and field's allocation.

This is not a process-memory measurement or an allocation limit. It excludes upper-layer inputs,
adjacency matrices, GPU workspace, and other temporary build storage. Lucene's public
`IndexWriter.ramBytesUsed()` uses cached indexing counters and does not automatically observe these
flush/merge allocations. On cleanup failure, the accounting scope ends without claiming that native
memory was successfully released. Flush policy, segment-size limits, and index formats are unchanged.

## Contributing

If you are interested in contributing to cuvs-lucene, please read the cuVS [Contributing guide](https://docs.nvidia.com/cuvs/developer-guide/contributing).
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
/*
* SPDX-FileCopyrightText: Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
* SPDX-License-Identifier: Apache-2.0
*/
package com.nvidia.cuvs.lucene;

import com.nvidia.cuvs.CuVSHostMatrix;
import com.nvidia.cuvs.CuVSMatrix;
import java.io.IOException;
import java.util.function.Supplier;
import org.apache.lucene.util.Accountable;
import org.apache.lucene.util.IOConsumer;
import org.apache.lucene.util.InfoStream;
import org.apache.lucene.util.RamUsageEstimator;

/**
* Tracks the compact primary host input while one field is filled, built, and written.
* Each writer uses one instance, with allocation scopes run sequentially by one caller at a time.
*
* <p>This is payload accounting, not an allocator measurement or memory limit. It excludes
* upper-layer inputs, adjacency matrices, GPU workspace, and other temporary build storage.
* Lucene's cached IndexWriter accounting does not poll this value during flushes or merges.
*/
final class HostInputMemory implements Accountable {
private static final long SHALLOW_BYTES =
RamUsageEstimator.shallowSizeOfInstance(HostInputMemory.class);

private final InfoStream infoStream;
private final String component;
private final String segment;
private long inputBytes;

HostInputMemory(InfoStream infoStream, String component, String segment) {
this.infoStream = infoStream;
this.component = component;
this.segment = segment;
}

/** The action must close the built dataset, or transfer it to an index that it closes. */
void withMatrix(
String field,
long rows,
long columns,
CuVSMatrix.DataType type,
IOConsumer<CuVSMatrix.Builder<CuVSHostMatrix>> buildAndWrite)
throws IOException {
long bytes = payloadBytes(rows, columns, type);
withAllocation(field, bytes, () -> CuVSMatrix.hostBuilder(rows, columns, type), buildAndWrite);
}

// The factory boundary lets lifecycle tests inject allocation/cleanup failures without native
// RAM.
void withAllocation(
String field,
long bytes,
Supplier<CuVSMatrix.Builder<CuVSHostMatrix>> allocate,
IOConsumer<CuVSMatrix.Builder<CuVSHostMatrix>> buildAndWrite)
throws IOException {
try (CuVSMatrix.Builder<CuVSHostMatrix> builder = allocate.get()) {
// Built-in host builders allocate the complete compact matrix before returning.
inputBytes = bytes;
if (infoStream.isEnabled(component)) {
infoStream.message(
component,
"primary_host_input_bytes=" + bytes + " segment=" + segment + " field=" + field);
}
buildAndWrite.accept(builder);
} finally {
// Scope completion is not proof of deallocation if native cleanup itself failed.
inputBytes = 0;
}
}

static long payloadBytes(long rows, long columns, CuVSMatrix.DataType type) {
if (rows < 0 || columns < 0) {
throw new IllegalArgumentException("Matrix dimensions must be nonnegative");
}
return Math.multiplyExact(Math.multiplyExact(rows, columns), type.bytes());
}

@Override
public long ramBytesUsed() {
return SHALLOW_BYTES + inputBytes;
}
}
Loading
Loading