Skip to content
Open
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 @@ -219,44 +219,120 @@ public static long calculateMaxPageEstimatedMemoryUsageInBytesWithBatchData(

public static List<Long> calculatePageEstimatedMemoryUsageInBytesWithBatchDataList(
final Chunk timeChunk, final List<Chunk> valueChunkList) throws IOException {
final ByteBuffer timeChunkDataBuffer = timeChunk.getData().duplicate();
final List<ByteBuffer> valueChunkDataBufferList = new ArrayList<>(valueChunkList.size());
final PageMemoryUsageEstimator estimator = new PageMemoryUsageEstimator(timeChunk);
for (final Chunk valueChunk : valueChunkList) {
valueChunkDataBufferList.add(
Objects.isNull(valueChunk) ? null : valueChunk.getData().duplicate());
estimator.addValueChunk(valueChunk);
}
return estimator.getPageEstimatedMemoryUsageInBytesList();
}

final List<Long> pageEstimatedMemoryUsageInBytesList = new ArrayList<>();
while (timeChunkDataBuffer.remaining() > 0) {
long pageUncompressedSizeInBytes = 0;
final PageHeader timePageHeader =
SinglePageWholeChunkReader.deserializePageHeader(
timeChunkDataBuffer, timeChunk.getHeader());
pageUncompressedSizeInBytes += timePageHeader.getUncompressedSize();
SinglePageWholeChunkReader.skipCompressedPageData(timeChunkDataBuffer, timePageHeader);

final List<TSDataType> valueDataTypeList = new ArrayList<>(valueChunkList.size());
for (int i = 0; i < valueChunkList.size(); ++i) {
final Chunk valueChunk = valueChunkList.get(i);
final ByteBuffer valueChunkDataBuffer = valueChunkDataBufferList.get(i);
if (Objects.isNull(valueChunk) || Objects.isNull(valueChunkDataBuffer)) {
valueDataTypeList.add(null);
continue;
}
static final class PageMemoryUsageEstimator {

final PageHeader valuePageHeader =
private final List<Long> pageUncompressedSizeInBytesList = new ArrayList<>();
private final List<Integer> pageRowCountList = new ArrayList<>();
private List<Long> pageEstimatedMemoryUsageInBytesList = new ArrayList<>();

private int valueCount;
private TSDataType singleValueDataType;
private long vectorValueMemoryUsageInBytes;

PageMemoryUsageEstimator(final Chunk timeChunk) throws IOException {
final ByteBuffer timeChunkDataBuffer = timeChunk.getData().duplicate();
timeChunkDataBuffer.rewind();
while (timeChunkDataBuffer.remaining() > 0) {
final PageHeader timePageHeader =
SinglePageWholeChunkReader.deserializePageHeader(
valueChunkDataBuffer, valueChunk.getHeader());
pageUncompressedSizeInBytes += valuePageHeader.getUncompressedSize();
valueDataTypeList.add(valueChunk.getHeader().getDataType());
SinglePageWholeChunkReader.skipCompressedPageData(valueChunkDataBuffer, valuePageHeader);
timeChunkDataBuffer, timeChunk.getHeader());
pageUncompressedSizeInBytesList.add((long) timePageHeader.getUncompressedSize());
pageRowCountList.add(SinglePageWholeChunkReader.getPageRowCount(timePageHeader, timeChunk));
SinglePageWholeChunkReader.skipCompressedPageData(timeChunkDataBuffer, timePageHeader);
}
pageEstimatedMemoryUsageInBytesList = calculatePageEstimatedMemoryUsageInBytesList();
}

long calculateMaxPageEstimatedMemoryUsageInBytesWithValueChunk(final Chunk valueChunk)
throws IOException {
final List<Long> pageEstimatedMemoryUsageInBytesList =
calculatePageEstimatedMemoryUsageInBytesList(valueChunk, false);
return pageEstimatedMemoryUsageInBytesList.isEmpty()
? 0
: pageEstimatedMemoryUsageInBytesList.get(0);
}

void addValueChunk(final Chunk valueChunk) throws IOException {
pageEstimatedMemoryUsageInBytesList =
calculatePageEstimatedMemoryUsageInBytesList(valueChunk, true);
}

List<Long> getPageEstimatedMemoryUsageInBytesList() {
return pageEstimatedMemoryUsageInBytesList;
}

private List<Long> calculatePageEstimatedMemoryUsageInBytesList() {
final List<Long> pageEstimatedMemoryUsageInBytesList =
new ArrayList<>(pageUncompressedSizeInBytesList.size());
for (int i = 0; i < pageUncompressedSizeInBytesList.size(); ++i) {
pageEstimatedMemoryUsageInBytesList.add(
SinglePageWholeChunkReader.estimatePageMemoryUsageInBytesWithBatchData(
pageUncompressedSizeInBytesList.get(i),
pageRowCountList.get(i),
valueCount,
singleValueDataType,
vectorValueMemoryUsageInBytes));
}
pageEstimatedMemoryUsageInBytesList.add(
SinglePageWholeChunkReader.estimatePageMemoryUsageInBytesWithBatchData(
pageUncompressedSizeInBytes,
SinglePageWholeChunkReader.getPageRowCount(timePageHeader, timeChunk),
valueDataTypeList));
return SinglePageWholeChunkReader.toSuffixMaxList(pageEstimatedMemoryUsageInBytesList);
}

private List<Long> calculatePageEstimatedMemoryUsageInBytesList(
final Chunk valueChunk, final boolean commit) throws IOException {
final ByteBuffer valueChunkDataBuffer;
final TSDataType valueDataType;
if (Objects.isNull(valueChunk)) {
valueChunkDataBuffer = null;
valueDataType = null;
} else {
valueChunkDataBuffer = valueChunk.getData().duplicate();
valueChunkDataBuffer.rewind();
valueDataType = valueChunk.getHeader().getDataType();
}

final int newValueCount = valueCount + 1;
final TSDataType newSingleValueDataType = valueCount == 0 ? valueDataType : null;
final long newVectorValueMemoryUsageInBytes =
vectorValueMemoryUsageInBytes
+ SinglePageWholeChunkReader.estimateVectorValueMemoryUsageInBytes(valueDataType);
final List<Long> newPageUncompressedSizeInBytesList =
new ArrayList<>(pageUncompressedSizeInBytesList);
final List<Long> pageEstimatedMemoryUsageInBytesList =
new ArrayList<>(pageUncompressedSizeInBytesList.size());

for (int i = 0; i < newPageUncompressedSizeInBytesList.size(); ++i) {
if (Objects.nonNull(valueChunkDataBuffer)) {
final PageHeader valuePageHeader =
SinglePageWholeChunkReader.deserializePageHeader(
valueChunkDataBuffer, valueChunk.getHeader());
newPageUncompressedSizeInBytesList.set(
i, newPageUncompressedSizeInBytesList.get(i) + valuePageHeader.getUncompressedSize());
SinglePageWholeChunkReader.skipCompressedPageData(valueChunkDataBuffer, valuePageHeader);
}
pageEstimatedMemoryUsageInBytesList.add(
SinglePageWholeChunkReader.estimatePageMemoryUsageInBytesWithBatchData(
newPageUncompressedSizeInBytesList.get(i),
pageRowCountList.get(i),
newValueCount,
newSingleValueDataType,
newVectorValueMemoryUsageInBytes));
}

if (commit) {
pageUncompressedSizeInBytesList.clear();
pageUncompressedSizeInBytesList.addAll(newPageUncompressedSizeInBytesList);
valueCount = newValueCount;
singleValueDataType = newSingleValueDataType;
vectorValueMemoryUsageInBytes = newVectorValueMemoryUsageInBytes;
}

return SinglePageWholeChunkReader.toSuffixMaxList(pageEstimatedMemoryUsageInBytesList);
}
return SinglePageWholeChunkReader.toSuffixMaxList(pageEstimatedMemoryUsageInBytesList);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -180,6 +180,7 @@ static int getPageRowCount(final PageHeader pageHeader, final Chunk chunk) throw

private static int countSinglePageTimeValues(final Chunk chunk) throws IOException {
final ByteBuffer chunkDataBuffer = chunk.getData().duplicate();
chunkDataBuffer.rewind();
final PageHeader pageHeader = deserializePageHeader(chunkDataBuffer, chunk.getHeader());
final ByteBuffer pageData = deserializePageData(pageHeader, chunkDataBuffer, chunk.getHeader());
final Decoder decoder =
Expand All @@ -206,25 +207,42 @@ static long estimatePageMemoryUsageInBytesWithBatchData(
final long pageUncompressedSizeInBytes,
final int rowCount,
final List<TSDataType> valueDataTypeList) {
final int valueCount = valueDataTypeList.size();
return estimatePageMemoryUsageInBytesWithBatchData(
pageUncompressedSizeInBytes,
rowCount,
valueCount,
valueCount == 1 ? valueDataTypeList.get(0) : null,
estimateVectorValueMemoryUsageInBytes(valueDataTypeList));
}

static long estimatePageMemoryUsageInBytesWithBatchData(
final long pageUncompressedSizeInBytes,
final int rowCount,
final int valueCount,
final TSDataType singleValueDataType,
final long vectorValueMemoryUsageInBytes) {
return pageUncompressedSizeInBytes
+ estimateBatchDataMemoryUsageInBytes(rowCount, valueDataTypeList);
+ estimateBatchDataMemoryUsageInBytes(
rowCount, valueCount, singleValueDataType, vectorValueMemoryUsageInBytes);
}

private static long estimateBatchDataMemoryUsageInBytes(
final int rowCount, final List<TSDataType> valueDataTypeList) {
final int valueCount = valueDataTypeList.size();
final int rowCount,
final int valueCount,
final TSDataType singleValueDataType,
final long vectorValueMemoryUsageInBytes) {
final long segmentCount = Math.max(1, (rowCount + 15L) / 16);
long estimatedMemoryUsageInBytes = RamUsageEstimator.sizeOfLongArray(16) * segmentCount;

if (valueCount == 1) {
estimatedMemoryUsageInBytes +=
estimateSingleValueArrayMemoryUsageInBytes(rowCount, valueDataTypeList.get(0));
estimateSingleValueArrayMemoryUsageInBytes(rowCount, singleValueDataType);
} else if (valueCount > 1) {
estimatedMemoryUsageInBytes += RamUsageEstimator.sizeOfObjectArray(16) * segmentCount;
estimatedMemoryUsageInBytes +=
(long) rowCount
* (RamUsageEstimator.sizeOfObjectArray(valueCount)
+ estimateVectorValueMemoryUsageInBytes(valueDataTypeList));
* (RamUsageEstimator.sizeOfObjectArray(valueCount) + vectorValueMemoryUsageInBytes);
}

return estimatedMemoryUsageInBytes;
Expand Down Expand Up @@ -263,18 +281,21 @@ private static long estimateVectorValueMemoryUsageInBytes(
final List<TSDataType> valueDataTypeList) {
long estimatedMemoryUsageInBytes = 0;
for (final TSDataType dataType : valueDataTypeList) {
if (Objects.isNull(dataType)) {
continue;
}

estimatedMemoryUsageInBytes +=
RamUsageEstimator.alignObjectSize(
RamUsageEstimator.NUM_BYTES_OBJECT_HEADER
+ estimateTsPrimitiveTypeValueMemoryUsageInBytes(dataType));
estimatedMemoryUsageInBytes += estimateVectorValueMemoryUsageInBytes(dataType);
}
return estimatedMemoryUsageInBytes;
}

static long estimateVectorValueMemoryUsageInBytes(final TSDataType dataType) {
if (Objects.isNull(dataType)) {
return 0;
}

return RamUsageEstimator.alignObjectSize(
RamUsageEstimator.NUM_BYTES_OBJECT_HEADER
+ estimateTsPrimitiveTypeValueMemoryUsageInBytes(dataType));
}

private static long estimateTsPrimitiveTypeValueMemoryUsageInBytes(final TSDataType dataType) {
switch (dataType) {
case BOOLEAN:
Expand Down
Loading
Loading