2011-11-30 77 views
0

我对处理大文件和内存约束的经验非常少。 请注意,我使用Java作为编程语言。写入文件时哪一个更快?

我必须找到文件大小为15GB的记录,然后将结果写入另一个文件。基本上它是一个搜索范围功能的实现。我的目标是将我范围内的记录写入以换行符分隔的结果文件。那就是每个记录应该分开来。这些查询的数量大约是400-1000。所以每个查询都会导致写入许多记录在其范围内。

那么以下哪种方法更快?

1-只要我开始获取查询范围记录,我就开始将它们写入文件串行?

2-我在一些字符串中存储我的记录,并在每个找到的记录的字符串中追加,然后最后写入它?

3-使用字符串生成器来连接每个查询的结果,然后在最后写入文件?但字符串生成器不支持新行。

4-建立我自己的数据结构?

5-制作记录数组列表,然后在最后遍历它以写入文件?

请让我知道哪种方法在IO和MM方面都是最快的。

+0

嗯,我们不能使用数据库,因为它是一个项目来构建数据库,所以我们不能使用任何提供索引或数据库相关功能的库。对不起,你没有标记回答的问题是什么意思?你在谈论关于堆栈溢出问题以外的其他问题吗?谢谢 ! – Basmah

+0

不是说StringBuilder是最好的解决方案,但我几乎积极支持换行 –

回答

4

OS级别的写入缓冲非常有效。除非你有探查数据表明存在问题,否则请去#1。

+0

oKAY谢谢!我正在尝试这个。 – Basmah

+0

+1:不要忘记使用像BufferedOutputStream这样的缓冲区。如果你的程序足够高效,你的瓶颈很可能是I/O。 –

0

2和3都听起来像是自制的缓冲实现。一个更简单和更有效的方法是做#1,但用BufferedOutputStream包装你的FileOutputStream

如果您正在讨论大量记录,那么编号5可能是个坏主意,因为您实际上可能会导致交换(这只会影响性能)。

+0

RandomAccessFile怎么样?好吗? – Basmah

+0

我到目前为止使用的方法是,我将记录写入大小等于PageSize(4096K)的缓冲区,然后使用Java随机访问文件。写字符写一个页面大小的字符串缓冲区。但似乎你告诉我的方法要快得多。所以,现在我会尝试使用这个。谢谢 ! – Basmah

0

我认为Map and Reduce最适合这个。我没有在这方面工作,但参加了同样的一个会议,这家伙使用相同的例子。分割你的文件,并让多个程序运行相同的搜索查询 - 地图,然后一旦搜索完成,所有的答案可以合并成一个使用Reduce

+0

其实我的钥匙不是唯一的。我的数据只有两列,一列是关键字,另一列是值。关键是可变大小,范围从7-15位,并且键也在数据中重复。所以我怀疑我是否可以对密钥使用散列,因为MapReduce对密钥使用散列。非常感谢你的建议。 – Basmah