Вы продолжаете пересчитывать размер создаваемой вами партии. Таким образом, вы много пересчитываете размер некоторых элементов данных. Было бы полезно, если бы вы вычислили размер данных каждого элемента данных и просто добавили его в переменную, чтобы отслеживать текущий размер пакета.
Попробуйте что-то вроде этого:
long batchSizeLimitInBytes = 1048576;
var batches = new List<List<T>>();
var currentBatch = new List<T>();
var currentBatchLength = 0;
for (int i = 0; i < data.Count; i++)
{
var currentData = data[i];
var currentDataLength = GetObjectSizeInBytes(currentData);
if (currentBatchLength + currentDataLength > batchSizeLimitInBytes)
{
batches.Add(currentBatch);
currentBatchLength = 0;
currentBatch = new List<T>();
}
currentBatch.Add(currentData);
currentBatchLength += currentDataLength;
}
В качестве идентификатора я, вероятно, захочу преобразовать данные в байтовые потоки только один раз, поскольку это дорогостоящая операция. В настоящее время вы конвертируете в потоки только для проверки длины, вы можете захотеть, чтобы этот метод не возвращал пакетные потоки вместо List<List<T>>
.