【问题标题】:Which one is Faster in Writing to a file?哪个写入文件更快?
【发布时间】:2011-11-30 07:09:14
【问题描述】:

我在处理大文件和内存限制方面的经验非常少。 请注意,我使用 Java 作为编程语言。

我必须找到文件大小为 15GB 的记录,然后将结果写入另一个文件。基本上它是一个搜索范围功能的实现。我的目标是将我范围内的记录写入结果文件,并用换行符分隔。也就是说,每条记录都应该放在单独的行上。此类查询的数量在 400-1000 左右。因此,每个查询都会写入许多位于其范围内的记录。

那么下面哪个是更快的方法?

1- 一旦我开始获取我的查询范围记录,我就开始将它们连续写入文件?

2- 我将我的记录存储在某个字符串中,并为找到的每条记录附加到字符串中,然后最后写入?

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

4- 制作我自己的数据结构?

5- 创建一个记录数组列表,然后在最后对其进行迭代以写入文件?

请告诉我哪种方法在 IO 和 MM 方面最快。

【问题讨论】:

  • 好吧,我们不能使用数据库,因为它是一个用 Java 构建数据库的项目,所以我们不能使用任何提供任何索引或数据库相关功能的库。抱歉,未标记已回答问题是什么意思?你是在说我在 Stack Overflow 上问的除此之外的问题吗?谢谢!
  • 不是说 StringBuilder 是最好的解决方案,但我几乎肯定它支持换行符

标签: java performance data-structures io main-memory-database


【解决方案1】:

操作系统级别的写缓冲非常有效。除非您有探查器数据表明存在问题,否则请选择 #1。

【讨论】:

  • 好的,谢谢!我现在正在尝试。
  • +1:不要忘记使用像 BufferedOutputStream 这样的缓冲区。如果你的程序足够高效,你的瓶颈很可能是 I/O。
【解决方案2】:

2 和 3 听起来都像是本土的缓冲实现。一种更简单、更有效的方法是执行 #1,但将 FileOutputStream 包装为 BufferedOutputStream

如果您谈论的是大量记录,则数字 5 可能不是一个好主意,因为您实际上可能会导致交换(这只会损害性能)。

【讨论】:

  • 我目前使用的方法是将记录写入大小等于 PageSize (4096K) 的缓冲区,然后使用 Java 随机访问文件。写入字符以写入一页大小的字符串缓冲区。但似乎你告诉的方法要快得多。所以,现在我将尝试使用它。谢谢!
【解决方案3】:

我认为 Map 和 Reduce 最适合这个。我没有为此工作,但参加了同样的会议,那个人为此使用了相同的例子。拆分文件并让多个程序运行相同的搜索查询 - 映射,然后一旦搜索完成,所有答案都可以使用 Reduce 合并为一个

【讨论】:

  • 其实我的key不是唯一的。我的数据只有两列,一列是键,另一列是值。密钥的大小可变,范围为 7-15 位,并且密钥在数据中也是重复的。所以我怀疑我是否可以使用散列作为键,因为 MapReduce 使用散列作为键。非常感谢您的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多