Java 有效存储市场数据价格值 (BigDecimal)
Java Storing market data price values effectively (BigDecimal)
我有以下 csv:
20120201 000000;1.306600;1.306600;1.306560;1.306560;0
哪里
Row Fields: DateTime Stamp;Bar OPEN Bid Quote;Bar HIGH Bid Quote;Bar
LOW Bid Quote;Bar CLOSE Bid Quote;Volume
DateTime Stamp Format: YYYYMMDD HHMMSS
Legend: YYYY – Year MM – Month (01 to 12) DD – Day of the Month HH –
Hour of the day (in 24h format) MM – Minute SS – Second, in this case
it will be allways 00
其 EUR/USD 市场数据(BAR 1 分钟)。
问题是: 我需要在 java 程序的内存中存储尽可能多的数据,这样我就不必在使用 them.Preferably 将它们全部存储起来,因为我不介意这会占用多少内存。
我想我必须使用 BigDecimal 来保持精度(我将不得不对这些价格进行一些算术运算)。每个 row.One 文件有 3 个 bigDecimals,包括 400 000 行,这是我的很多对象必须 create.There 可能是多个文件, 相当于数百万 objects.In 添加 BigDecimal 会产生开销。
问题:最好way/data structure/collection 将此数据存储在内存中? 一次缓存固定数量 100k?使用与 BigDecimal 不同的东西(但是我需要保持精度)?或者尽我所能加载所有内容?
如果有更好的方法,我也不想花费大量计算时间来创建大量 BigDecimal 对象。
我目前的想法是尽可能多地加载 can.Bud 当我必须将此代码移植到 C#(要求)时,我担心有很多缺点/以及问题。
Big Decimal 实例在内存中占用 32 个字节。
一百万个 BigDecimals 将是 32000000 个字节。
即 31250 千字节,30.5 兆字节
所以 1000 万将是 305 兆字节。
当接近 1 亿时,您将需要 3 场演出。还是有道理的。
那你的LOT真的很多吗?
关于处理代码,我建议你把它处理成块,并在继续下一个块之前处理这些块。
BufferedReader 在这方面真的很有用,它可以分块加载文件,边走边处理。
并且创建许多对象将由解释器进行优化,因此它实际上可能会非常快。
只是一个例子
举个例子,我有一段代码生成了超过 400 MB 的 json 文件。稍后读取这些 json 文件会在 30 秒内发生,同时还会发生许多其他进程。
那些 json 文件比 csv 文件的处理 data/structure 密集得多。所以我真的认为你不应该担心处理开销。
我有以下 csv:
20120201 000000;1.306600;1.306600;1.306560;1.306560;0
哪里
Row Fields: DateTime Stamp;Bar OPEN Bid Quote;Bar HIGH Bid Quote;Bar LOW Bid Quote;Bar CLOSE Bid Quote;Volume
DateTime Stamp Format: YYYYMMDD HHMMSS
Legend: YYYY – Year MM – Month (01 to 12) DD – Day of the Month HH – Hour of the day (in 24h format) MM – Minute SS – Second, in this case it will be allways 00
其 EUR/USD 市场数据(BAR 1 分钟)。
问题是: 我需要在 java 程序的内存中存储尽可能多的数据,这样我就不必在使用 them.Preferably 将它们全部存储起来,因为我不介意这会占用多少内存。
我想我必须使用 BigDecimal 来保持精度(我将不得不对这些价格进行一些算术运算)。每个 row.One 文件有 3 个 bigDecimals,包括 400 000 行,这是我的很多对象必须 create.There 可能是多个文件, 相当于数百万 objects.In 添加 BigDecimal 会产生开销。
问题:最好way/data structure/collection 将此数据存储在内存中? 一次缓存固定数量 100k?使用与 BigDecimal 不同的东西(但是我需要保持精度)?或者尽我所能加载所有内容?
如果有更好的方法,我也不想花费大量计算时间来创建大量 BigDecimal 对象。
我目前的想法是尽可能多地加载 can.Bud 当我必须将此代码移植到 C#(要求)时,我担心有很多缺点/以及问题。
Big Decimal 实例在内存中占用 32 个字节。 一百万个 BigDecimals 将是 32000000 个字节。 即 31250 千字节,30.5 兆字节 所以 1000 万将是 305 兆字节。 当接近 1 亿时,您将需要 3 场演出。还是有道理的。
那你的LOT真的很多吗?
关于处理代码,我建议你把它处理成块,并在继续下一个块之前处理这些块。
BufferedReader 在这方面真的很有用,它可以分块加载文件,边走边处理。
并且创建许多对象将由解释器进行优化,因此它实际上可能会非常快。
只是一个例子
举个例子,我有一段代码生成了超过 400 MB 的 json 文件。稍后读取这些 json 文件会在 30 秒内发生,同时还会发生许多其他进程。
那些 json 文件比 csv 文件的处理 data/structure 密集得多。所以我真的认为你不应该担心处理开销。