我有一个针对复杂问题的多目标粒子群优化算法,它使用大量人口(4000个粒子)并且是一个耗时的模拟(执行4-6小时)。
由于算法保存了一个存档,这是迄今为止发现的最佳解决方案的存储库,为了分析算法的收敛和行为,我需要从这个存储库中保存一些数据,有时还要在每次迭代时从整个数据库中保存。
目前在每次迭代中,我(Java)都会从粒子的对象(来自存储库和/或填充)复制一些属性,将其格式化为StringBuffer,该方法在模拟的单独线程中运行, ,只有在程序执行结束时,我才将其保存到文本文件中。
我认为我的算法通过这样做会以一种糟糕的方式消耗内存。但是考虑性能我不知道保存所有这些数据的最佳方法是什么:我应该遵循相同的逻辑但是每次迭代都保存.txt文件而不是在算法结束时这样做吗?或者我应该保存到数据库?如果是这样,我应该在每次迭代中还是在结束时或其他时间保存它?或者我应该以某种方式对待它?
编辑:存储库数据通常在[5 - 10] MB范围内,而人口数据占用[100 - 200] MB内存。每次运行程序时,我都需要大约20次模拟来分析平均收敛。
答案 0 :(得分:1)
StringBuffer
使用数组来保存字符,这是连续的内存区域。每当需要扩展它时,它会创建一个大两倍的新数组。通常它对于大多数应用程序来说已经足够了,但是如果你认为这个缓冲区非常大并且想要消除管理连续内存部分的开销,你可以用字符串列表(或StringBuffers)替换它。这将需要更多内存,但它不需要这个内存是连续的。