对于一个复杂的问题,我有一个多目标粒子群优化算法,它使用了一个大种群(4000个粒子),并且是一个耗时的模拟(4-6个小时的执行)。
由于该算法保存了存档,是迄今为止找到的最佳解决方案的存储库,为了分析算法的收敛性和行为,我需要在每次迭代时从存储库中保存一些数据,有时还保存整个种群的数据。
目前,在每次迭代中,我(使用Java语言)从粒子的对象(从存储库和/或填充)复制一些属性,将其格式化为一个StringBuffer,该方法运行在一个独立的线程中,与模拟不同,只有在程序执行结束时,我才将它保存到一个文本文件中。
我认为我的算法这样做是在用不好的方式消耗内存。但是,考虑到性能,我不知道保存所有这些数据的最佳方法是什么:我是否应该遵循相同的逻辑,而是在每次迭代时保存一个.txt文件,而不是在算法结束时这样做?还是应该保存到数据库中?如果是这样的话,我应该在每次迭代中保存它,还是在结束时或下一次保存?还是我应该以不同的方式对待它?
编辑:存储库数据通常在5-10 MB的范围内,而总体数据占用100到200 MB的内存。每次我运行程序时,我需要大约20个模拟来分析平均收敛性。
发布于 2012-12-17 21:52:20
StringBuffer使用一个数组来保留字符,这是一个连续的内存区域。每当需要扩展时,它都会创建一个新的数组,该数组的大小是原来的两倍。通常,对于大多数应用程序来说,它已经足够了,但是如果您认为这个缓冲区非常大,并且希望消除管理内存连续部分的开销,您可以用String列表(或StringBuffers)替换它。这将需要更多的内存,但它不需要这个内存是连续的。
https://stackoverflow.com/questions/13921453
复制相似问题