【问题标题】:Java store varying machine data in objectJava 在对象中存储不同的机器数据
【发布时间】:2018-09-28 09:24:31
【问题描述】:

我需要能够存储来自生产机器的传入数据以对其执行一些计算。我从 API 接收数据,它看起来像这样:

[
    {
        "datasetId":23
        "timestamp":1538125706336,
        "machineData":[
            {
                "machineId":<UUID>,
                "type":"PLASTIC_INJECTOR",
                "data":[
                    "temperature":30,
                    "pressure":32
                ]
            },
            ...
        ]

    },
    ...
]

machineData 数组包含多种不同类型的机器,它们发出不同的测量值。有些有温度,有些有温度,例如“消耗的水量”。此外,一些机器由于维护等原因处于离线状态,因此阵列并不总是包含相同的机器。我的问题是如何将这些信息存储在对象中。

我的想法是这样的:

public class MachineData{
    private long datasetId,
    private long timestamp;
    private Map<UUID, MachineDataEntry> dataPerMachine;
}

public class MachineDataEntry{
    private Map<String, float> measurements;
}

所以 MachineDataEntry 表示“machineData”中每台机器的“data”数组的内容。

我对其进行了测试,它可以在开发中使用,但我担心一旦我需要处理超过 10000 个条目的 API 响应,我可能会遇到性能问题。

有没有更智能的方法来做到这一点?

【问题讨论】:

  • 您是否总是需要在一个回复中包含所有这些条目?无论您如何构建这些条目,包含这么多条目的响应都可能导致性能问题。
  • 是的,我需要所有这些数据,而且我无法编辑 api 以仅提供一小部分,它遥不可及

标签: java


【解决方案1】:

地图真的很快。唯一的问题是您可能想要选择HashMapTreeMapHashMap 更节省时间(O(1) 次操作),TreeMap 更节省空间(没有重新散列,但 O(log(n)) 次操作)。

This 的问题有点相关。当您快速向HashMap 添加大量元素时,可能需要重新散列很多,这会降低性能,但如果您期望很多,您可以通过在初始化时设置高容量(或容量增量)来修复它条目数。

【讨论】:

  • 数据结构不需要是线程安全的。通常有大约。连接了 8 台机器,每台机器提供大约 2 次测量。 HashMap 适合这种数据量吗?
  • 完全如此。 HasMap 唯一的缺点是它是未排序的,这意味着如果你决定对它进行遍历,它会返回不按照你放入的顺序的项目。
猜你喜欢
  • 1970-01-01
  • 2016-07-18
  • 1970-01-01
  • 2014-06-19
  • 2018-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多