在Fortran中处理更改数组的最佳方法

时间:2015-12-08 18:15:30

标签: arrays performance fortran

我们说我有一个2D阵列。沿着第一个轴,我有一系列属性可用于单个测量。沿着第二轴我有一系列测量。

因此,例如,数组看起来像这样:

         personA personB personC
height   1.8     1.75    2.0
weight   60.5    82.0    91.3
age      23.1    65.8    48.5

或类似的东西。

我想经常更改数组的大小 - 例如,忽略personB的数据,包括personDpersonE。我将循环播放"时间",可能是> 10 ^ 5时间步长。每个时间步,每个人都有机会"数组中的数据可能会被删除,并且有可能会将几个新人引入模拟中。

从我所看到的有几种方法来管理这样的数组:

覆盖和不经常重新分配

我可以使用一个带有额外列的非常大的数组,其中我放了一个" skip"旗。因此,如果我决定不再需要personB,我会将标记设置为1并在每次循环查看人员列表时忽略personB。当我需要添加personD时,我会在列表中搜索skip == 1的第一个人,将数据替换为personD的数据,然后设置skip = 0。如果没有skip == 1的任何人,我会复制该数组,取消分配该数组,再将其与多个列重新分配,然后使用personD数据填充第一个新列。

优点:

  • 不经常分配 - 可能性能更好
  • 轻松访问数组元素
  • 更容易优化

缺点:

  • 如果我的阵列收缩很多,我会浪费大量内存
  • 我需要在数据中添加一行,我必须执行检查以确保不使用不相关的数据。如果阵列从1000人减少到1人,我将不得不循环通过999个额外记录
  • 如果我有一个非常大的数组要复制
  • 可能会遇到内存问题

经常重新分配

每次我想添加或删除一些数据时,我都会复制并重新分配整个数组。

优点:

  • 我知道阵列中的每一段数据都是相关的,所以我不必检查它们
  • 轻松访问数组元素
  • 没有浪费的记忆
  • 更容易优化

缺点:

  • 可能很慢
  • 如果我有一个非常大的数组要复制
  • 可能会遇到内存问题

链表

我重构所有内容,以便每个人的数据都包含指向下一个人数据的指针。然后,当我需要删除一个人时,我只需将其从指针链中删除并释放它,当我需要添加一个人时,我只需添加一些指向链末尾的指针。

优点:

  • 链中的每条记录都是相关的,所以我不必进行任何检查
  • 没有浪费的记忆
  • 不太可能遇到内存问题,因为我不必一次复制整个阵列

缺点:

  • 无法轻松访问数组元素。我无法用data(height,:)切片,例如
  • 更难以优化

我不确定此选项与其他两个选项相比的效果如何。

-

那么,问题是:还有其他选择吗?我什么时候应该使用这些选项?在我的情况下,其中一个选项比其他选项更好吗?

0 个答案:

没有答案
相关问题