想象一下,您正在模拟粒子物理。然后,您的每个对象都有一个以每秒数次的速度变化的位置向量。如果您的向量没有被破坏而只是被复制,这不会导致您的程序在结束之前淹没您的内存吗?
3 回答
如果您在谈论 java,垃圾收集是自动的,并且可以随时发生。我制作了一个程序,每秒将 matrix1 复制到 matrix2 并将 matrix2 复制到 matrix3(每个 2k 个元素)1000 次。没问题 :)
想象一下,您正在模拟粒子物理。
我会尽力。
然后,您的每个对象都有一个位置向量
我只是假设这些只是每个 sim 中少数抽象的基本粒子,而不是 TB 的实验数据。
它以每秒数次的速度变化。如果您的向量没有被破坏而只是被复制,这不会导致您的程序使用过多的内存直到它结束吗?
除了上述所有内容之外,这是一个非常基本的问题。答案是“视情况而定”。
你的语言垃圾被收集了吗?它特别是什么语言(没有双关语)?
你需要历史数据吗?或者更一般地说,首先不破坏向量的原因是什么?是否所有这些仍然被积极使用,被引用?
如果您需要所有这些用于 sim,即上述问题的答案是:是的,但您无能为力。也许a)使用大小优化的,可能是自定义的,数据和列表类型和b)如果实际适用-取决于数据的波动性-应用允许您仅存储差异的模式(未更改的向量可以存储为对以前的版本等)
如果您不需要它们来运行 sim,但需要保留它们“以备后用”,只需将它们以足够大的块刷新到磁盘中,以免浪费 IO 周期,在该步骤之后,同样适用于...:
如果您根本不需要它们,请确保让垃圾收集器有效工作(同样,细节取决于所使用的语言)或释放它们或重新使用分配的内存等......
这是一个非常笼统的问题,你给出的上下文虽然让你很有趣,但并没有真正给我们太多的继续。
当然,这取决于列表的大小。
我不会将粒子物理学中的位置向量放在不可变列表类别中,因为它们很可能是瞬态的和不断变化的(除非你打破了费米原理并将它们固定下来。)
我会说美国各州缩写的列表会是一个更好的候选者,因为那些不会改变 - 不包括分裂运动和战争。