Unity:从大型CSV文件中读取和更新数据

3

我有一个非常大的CSV文件(100万+行),其中包含四列数据timeidxy。以下是样例:

t   id  x   y
434 84  0   0
435 84  28.22   -4.5
435 611 1895.13 755.17
435 872 2401.08 159.12
435 65  0   226.39
436 84  50.44   -4.5
436 611 1890.63 732.5
436 872 2373.9  151.04
436 990 2614.97 372.74
...

在我的模拟中,随着时间的流逝,我需要执行以下三个操作之一:
  1. 如果这是一个id第一次出现,在x,y坐标处创建一个具有该id的对象

  2. 如果已经存在具有id的对象,更新该对象的x,y坐标

  3. 如果某个id不再出现,删除该对象

我猜每秒钟运行计时器、检查CSV文件并定位所有当前时间的行并执行上述步骤非常密集。在Unity模拟中处理时间序列数据是否有更有效的方法?

1
为什么不一次性读取文件并将所有内容加载到内存中呢?假设有2个整数、2个浮点数和大量行,1百万行应该约为15MB。 - mayo
@mayo,我有超过一百万行。我尝试在开始时将所有数据读取到2D数组中,但不幸的是,这并不能解决我每次更新都需要解析当前时间的问题。正如所料,我正在经历可怕的帧率问题,甚至还没有开始激活任何对象。 - rafvasq
哦,我明白了。在这种情况下,我认为Nick提供了一些好的建议。 现在,如果您的CVS将由外部源更新,也许您可以使用FileStream读取文件。这样,您可以保持文件打开状态,不必一次性读取所有文件,并且如果有新数据可供消耗,可以继续读取/浏览流(如果没有更多数据可读取,则停止读取,但您将继续检查是否在某个时候有更多数据)。 - mayo
这里有一个读取文本文件“永久”示例... https://dev59.com/cH_aa4cB1Zd3GeqPyxos#23306151 你可以做类似的事情,直到你决定停止模拟。 - mayo
1个回答

3

针对这么大的文件,你应该开始寻找替代方案。以下是一些想法,但最好的选择取决于你具体在做什么。

  • 更新此CSV的组件是否可以直接与Unity3d通信?例如使用套接字连接将避免不断地保存和读取此信息到磁盘上。但这显然取决于如何创建此CSV数据。
  • 你能否将CSV分成较小的文件?例如为每个时间戳创建一个文件?这样,在每个步骤中更新模拟的开销就会更少。
  • 你能否减少更新的频率?每秒更新是否必要?
  • 或者,你只能每10秒从CSV中读取一次,加载下一个10秒内的所有数据(例如该范围内的所有时间戳),将它们存储在内存中,然后在接下来的10秒中仅使用来自内存的信息进行更新,而不是再次读取文件?这将减少你对磁盘的调用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接