我对处理大型文件和有关内存的约束的经验很少。
请注意,我使用Java作为编程语言。
我必须找到文件大小为15GB的记录,然后将结果写入另一个文件。基本上,这是一个搜索范围功能的实现。我的目标是将我范围内的记录写到结果文件中,并用新行分隔。那就是每个记录应该放在单独的行上。此类查询的数量约为400-1000。因此,每个查询将导致写入许多位于其范围内的记录。
那么以下哪个是更快的方法?
1-一旦开始获取查询范围记录,就开始将它们连续写入文件中吗?
2-我将记录存储在某个字符串中,并为找到的每个记录添加字符串,然后最后写出来?
3-使用字符串生成器连接每个查询的结果,然后在末尾写入文件?但是字符串生成器不支持换行符。
4-制作自己的数据结构?
5-创建记录的数组列表,然后在最后遍历以写入文件?
请让我知道就IO和MM而言哪种方法最快。
好吧,我们不能使用数据库,因为它是一个用Java构建数据库的项目,因此我们不能使用任何提供任何索引或数据库相关功能的库。 抱歉,未标记回答的问题是什么意思? 您是否在谈论我在Stack Overflow上提出的其他问题? 谢谢 !
并不是说StringBuilder是最好的解决方案,但是我几乎肯定它支持换行
操作系统级别的写缓冲非常有效。 除非您有探查器数据表明存在问题,否则请选择#1。
好的谢谢! 我正在尝试这个。
+1:不要忘记使用BufferedOutputStream之类的缓冲区。 如果您的编程效率足够高,您的瓶颈可能就是I / O。
我认为Map and Reduce最适合于此。 我还没有从事这个工作,但是参加了相同的会议,而那个家伙为此使用了相同的例子。 拆分文件,让多个程序运行相同的搜索查询-Map,然后在完成搜索后,可以使用Reduce将所有答案合并为一个
其实我的钥匙不是唯一的。 我的数据只有两列,一列是键,另一列是值。 密钥的可变大小范围为7到15位数字,并且密钥也在数据中重复。 所以我怀疑我是否可以将散列用于键,因为MapReduce将散列用于键。 非常感谢您的建议。
2和3听起来都像是本地实现的缓冲实现。 一种更简单,更有效的方法是执行#1,但用BufferedOutputStream包装FileOutputStream。
如果您谈论的是大量记录,则5号可能不是一个好主意,因为您实际上可能会导致交换(这只会损害性能)。
到目前为止,我使用的方法是将记录写到大小等于PageSize(4096K)的缓冲区中,然后使用Java Random Access File。 write chars写入一页大小的字符串缓冲区。 但是看来您告诉的方法要快得多。 所以,现在我将尝试使用它。 谢谢 !