【问题标题】:Java Storing market data price values effectively (BigDecimal)Java 有效存储市场数据价格值 (BigDecimal)
【发布时间】:2017-02-09 11:57:54
【问题描述】:

我有以下 csv:

20120201 000000;1.306600;1.306600;1.306560;1.306560;0

在哪里

行字段:日期时间戳;条形开盘报价;条形高价报价;条形 LOW 报价;Bar CLOSE 报价;成交量

日期时间戳格式:YYYYMMDD HHMMSS

图例:YYYY – 年 MM – 月(01 到 12) DD – 月份中的日期 HH – 一天中的小时(24 小时格式) MM – 分钟 SS – 秒,在这种情况下 永远都是00

其欧元/美元市场数据(BAR 1 MIN)。

问题是:我需要在 java 程序的内存中存储尽可能多的数据,这样我就不必在使用它们时经常阅读它们。最好将它们全部存储,因为我不介意这将占用多少内存。

我想我必须使用 BigDecimal 来保持精确度(我必须对这些价格进行一些算术运算)。我每行有 3 个 bigDecimals。一个文件包含 400 000 行,这就是我必须创建的很多对象。可能有多个文件,witch 相当于数百万个对象。另外 BigDecimal 会带来开销。

问题:将这些数据存储在内存中的最佳方式/数据结构/集合是什么?一次缓存固定数字 100k?使用与 BigDecimal 不同的东西(我需要保持精度)?还是尽可能多地加载所有内容?

如果有更好的方法,我也不想花费大量计算时间来创建大量 BigDecimal 对象。

我目前的想法是尽可能多地加载。当我必须将此代码移植到 C#(要求)时,我害怕许多缺点/以及问题。

【问题讨论】:

  • 是什么让您认为“数百万个对象”会成为问题?你的机器有多少内存?我会尝试先编写最简单的代码,然后测试性能,而不是假设它会出现问题。
  • @Jon Skeet 我的机器有 16GB,我担心创建这些对象和之后使用这么大的集合/数据结构会产生更多开销。我认为您可能以多种方式进行测试是正确的。只是想知道是否有最佳实践或最优化/最有效的方法。

标签: java csv caching currency bigdecimal


【解决方案1】:

Big Decimal 实例占用 32 个字节的内存。 一百万个 BigDecimal 将是 32000000 字节。 那是 31250 千字节,30.5 兆字节 所以 1000 万将是 305 兆字节。 当接近 1 亿时,您将需要 3 场演出。还是合理的。

那么你的 LOT 真的很多吗?

至于处理代码,我建议你将它处理成块,并在继续下一个块之前处理这些块。

BufferedReader 可以在这方面提供真正的帮助,通过分块加载文件,随时处理。

并且创建许多对象会被解释器优化,所以它实际上可能会非常快。

只是一个例子

例如,我有一段代码,它生成 >400 mb 的 json 文件。稍后读取这些 json 文件会在 30 秒内发生,同时会发生许多其他进程。

与 csv 文件相比,这些 json 文件在处理过程中的数据/结构密集程度更高。所以我真的认为你不应该担心处理开销。

【讨论】:

  • 哦,这根本不是很多。我可能会将该行封装在另一个对象中以便更好地管理。我没有用这个来解码 JSON 文件的复杂性。
猜你喜欢
  • 2016-06-30
  • 2023-04-02
  • 1970-01-01
  • 2018-07-04
  • 1970-01-01
  • 2015-11-04
  • 1970-01-01
  • 2017-09-09
  • 2022-01-26
相关资源
最近更新 更多