我有以下csv:
20120201 000000;1.306600;1.306600;1.306560;1.306560;0
,其中
行字段:日期时间戳;栏开放出价报价;栏高出价报价;栏 低报价;栏关闭报价;成交量
日期时间戳格式:YYYYMMDD HHMMSS
传奇:YYYY - MM年 - 月(01至12)DD - 月份日HH - 一天中的小时(24小时格式)MM - 分钟SS - 第二,在这种情况下 永远都是00
其欧元/美元市场数据(BAR 1 MIN)。
问题是:我需要在java程序的内存中存储尽可能多的数据,所以我不必经常阅读它们,因为我使用它们。优先存储它们因为我不介意这需要多少记忆。
我想我必须使用BigDecimal来保持percision(我将不得不对这些价格做一些算术)。我每行有3个bigDecimal。一个文件包含40万行,这就是我必须要创建的很多对象。可能有多个文件,相当于数百万个对象。另外BigDecimal带有开销。
问题:将这些数据存储在内存中的最佳方式/数据结构/集合是什么?一次缓存固定数量为100k?使用与BigDecimal不同的东西(萌芽我需要保持精确度)?或者只是尽可能多地加载所有东西?
如果有更好的方法,我也不想花费大量的计算时间来创建大量的BigDecimal对象。
我当前的想法只是尽可能多地加载。当我必须将此代码移植到C#(需求)时,我现在害怕许多缺点/以及问题。
答案 0 :(得分:1)
Big Decimal实例占用内存中的32个字节。 一百万BigDecimals将是32000000字节。 那是31250千字节,30.5兆字节 所以1000万将是305兆字节。 当接近1亿你需要3演出。还是合理的。
你的LOT真的很多吗?
至于处理代码,我建议你把它处理成块,并在继续下一个块之前处理这些块。
BufferedReader可以通过以块的形式加载文件,随时进行处理来真正提供帮助。
创建许多对象将由解释器进行优化,因此实际上可能非常快。
只是一个例子
例如,我有一段代码,生成了> 400 MB的json文件。稍后读取这些json文件会在30秒内完成,同时会发生很多其他过程。
这些json文件在处理过程中比csv文件更加数据/结构密集。所以我真的认为你不应该担心处理开销。