【发布时间】:2017-09-21 18:25:06
【问题描述】:
我正在研究一种存储数据样本的内存存储解决方案。这适用于多线程趋势应用程序,该应用程序不断将项目写入存储阵列并定期从中删除项目。它将存储最新的 24 小时样本。我需要能够全部或部分获取数据。由于这些要求,我选择使用 CopyOnWriteArrayList。
存储解决方案存储在一个
CopyOnWriteArrayList<Point>.
我编写了两个类来存放数据:Point 和 Samples。
点包括:
private int ioId;
private int machineId;
private jPointType pointType; //(int)
private String subfield;
private long startTimestamp;
private long endTimestamp;
private int pruneLock;
private jTrendReqType predefType; //(int)
CopyOnWriteArrayList<Sample> dataList;
样本包括:
Long timestamp;
double data;
我目前正在使用 2/sec 数据和 30 个点(每个点 7200 个样本)进行测试。我运行了 1 个小时的测试,通过任务管理器看到增加了大约 10MB 的使用量。这最终是每个样本大约 45 个字节。对于我存储的数据类型,这似乎相当高。有这么多 Java 开销还是我做的事情效率低?
【问题讨论】:
-
看看Eclipse Memory Analyzer,也许它会帮助你更好地了解内存使用情况。
-
理论上,您可以摆脱 Point 类,并将所有内容写入
ByteBuffer,但这更难读取,而且读取速度可能更慢。CopyOnWriteArrayList对我来说似乎也有点重,因为它会在每次写入时复制列表。您说该列表是不断写入的,因此 CopyOnWrite 列表的性能会很糟糕。每个写入列表的线程都会创建并至少临时分配一个新的 ArrayList 实例。 -
@NickL 我同意它很重,但我不知道另一个具有良好可访问性以及线程安全的良好数据结构,因为读/写是从多个线程发生的。
标签: java memory-management data-structures