У меня есть некоторый код, который, я полагаю, запускается в O (n), однако, когда я его измеряю, кажется, что он выполняется за полиномиальное время.Я пытаюсь обработать ~ 200 000 записей, поэтому я сделал это блоками размером MAX_COUNT
, чтобы у меня не было свободного места в куче.То есть на этапе обработки происходит несколько вещей, которые резко увеличивают размер записей.
Я скопировал важные части из своего кода.Я чувствую, что здесь происходит что-то, что связано с ArrayLists, которые я просто не понимаю.
Возможно, это не самый умный способ решения проблем, но я не понимаю, почему обработка каждого блока занимает больше времени, чем предыдущий.То есть каждый блок имеет размер 5000 (кроме первого блока), но первый обработанный блок занимает ~ 5 секунд, а обработанный 20-й блок - ~ 25 секунд.Я ожидаю, что все они займут одинаковое количество времени.
// Maximum block size
final int MAX_COUNT = 5000;
// Total number of records in need of processing
int n = records.size();
// the number of blocks to process
int numBlocks = (n / MAX_COUNT) + 1;
if (n % MAX_COUNT == 0) numBlocks--;
// The number of records to process in the block.
int numRecords;
ArrayList<Record> recordBlock = null;
// Iterate backwards through the blocks.
for (int i = numBlocks; i > 0; i--) {
// Make sure we don't process too many records.
if ( (i == 1 && numBlocks = 1 && n % MAX_COUNT != 0) ||
(i == numBlocks && n % MAX_COUNT != 0) )
numRecords = n % MAX_COUNT;
else numRecords = MAX_COUNT;
recordBlock = new ArrayList<Record>();
//EDIT: Fixed loop syntax (typo!)
for (int j = numRecords -1; j >= 0; j--)
recordBlock.add(records.remove(j));
recordBlock = ThreadHelper.processRecords(recordBlock,true,true);
while (recordBlock.size() != 0) {
Record r = recordBlock.remove(recordBlock.size() -1);
// write 'r' to MySQL
}
}