Java 什么设计模式适合这种情况?

Java 什么设计模式适合这种情况?,java,design-patterns,Java,Design Patterns,我有2D水力数据,是包含网格中每个点的深度和速度信息的数十亿字节的文本文件,分解为时间步。每个时间步包含栅格中每个点的深度/速度值。因此,您可以在每个时间步中跟踪一个点,并查看其深度/速度的变化。我想一次读取一个时间步长的数据,计算各种数据-网格单元达到的最大深度,最大速度,水超过2英尺深的第一个时间步长的数量,等等。这些计算的结果将是网格-每个点的最大深度,等等 到目前为止,这听起来像是装饰图案。但是,我不知道如何从各种计算中得到结果——每次计算都会生成不同的网格。在创建每个decorator

我有2D水力数据,是包含网格中每个点的深度和速度信息的数十亿字节的文本文件,分解为时间步。每个时间步包含栅格中每个点的深度/速度值。因此,您可以在每个时间步中跟踪一个点,并查看其深度/速度的变化。我想一次读取一个时间步长的数据,计算各种数据-网格单元达到的最大深度,最大速度,水超过2英尺深的第一个时间步长的数量,等等。这些计算的结果将是网格-每个点的最大深度,等等

到目前为止,这听起来像是装饰图案。但是,我不知道如何从各种计算中得到结果——每次计算都会生成不同的网格。在创建每个decorator之后,我必须保留对它的引用,以便从中提取结果,或者添加一个
getResults()
方法来返回不同结果的映射,等等,这两种方法听起来都不理想

另一个选择是战略模式。每次计算都是一种不同的算法,它根据时间步长(当前深度/速度)和前几轮的结果(到目前为止的最大深度、到目前为止的最大速度等)进行操作。然而,这些以前的结果对于每次计算都是不同的——这意味着要么算法类变为有状态的,要么调用方的工作就是跟踪以前的结果并将其输入。我也不喜欢这种策略模式,因为在时间步上循环的行为是调用方的责任——我只想给“计算器”一个时间步上的迭代器(根据需要从磁盘获取它们),并让它生成所需的结果

其他限制:

  • 输入量很大,而且是从磁盘读取的,所以按时间步长精确迭代一次是唯一实用的方法
  • 网格较大,因此应尽可能在适当位置进行计算

如果我正确理解你的问题,你有一个网格点,它有许多时间步&每个时间步都有深度和速度。现在有了GBs的数据


我建议只传递一次数据&将解析后的数据存储在RDBMS中。然后对该数据运行查询或存储过程。这样,至少应用程序不会耗尽内存。首先,可能我没有很好地理解这个问题,没有抓住我答案中的要点,在这种情况下,我很抱歉占用您的时间

乍一看,我会想到一种更类似于“战略模式”的方法,结合面向数据的基础,类似于以下伪代码:

foreach timeStamp

  readGridData

  foreach activeCalculator in activeCalculators

    useCalculatorPointerListToAccessSpecificStoredDataNeededForNewCalculation

    performCalculationOnFreshGridData

    updateUpdatableData

    presentUpdatedResultsToUser

    storeGridResultsInDataPool(OfResultBaseClassType)

    discardNoLongerNeededStoredGridResults

  next calculator
next timeStep

再一次,如果这是离题的话,我很抱歉。

这真的是一个“设计模式”问题吗?当你需要组织你的程序时,模式是很有用的,但是这给我的印象更像是一个“缺乏适当的算法”问题,在这方面我帮不了你多少忙。然而,我的建议是,首先使用输入,只保留您需要的信息。然后使用模型视图模式,使用您第一次收集的数据以各种方式可视化数据。在这里,你可以从你的数据中进行更复杂的计算。首先,试图将一个设计问题归类到一个设计模式中,这与整个设计模式的理念完全相反。但我仍然不能很好地理解这个问题——计算应该在数据进来时进行还是在需要时进行?我不明白你所说的迭代/硬盘读取约束是什么意思——这是否意味着数据读取应该是最小的,并且缓存应该是最小的?是否可以记忆部分或全部算法?性能限制是什么?基本上,我有数千兆字节的文本文件,包含每个网格单元的深度和速度信息,分为时间步。每个时间步包含栅格中每个点的深度/速度值。因此,您可以在每个时间步中跟踪一个点,并查看其深度/速度的变化。我想一次读取一个时间步,计算各种数据-网格单元达到的最大深度,最大速度,水超过2英尺深的第一个时间步数,等等。这些计算的结果将是网格-每个点的最大深度,等等。编译时的计算未知,或者,您正在使用一组众所周知的固定计算?