【问题标题】:Repeated disk writes重复磁盘写入
【发布时间】:2013-01-02 00:06:06
【问题描述】:
我需要将单词列表写入文件,然后将文件保存在磁盘上。以下两种方法中的一种是否比另一种更好?第二个显然使用更多的主内存,但速度有区别吗?
(这只是伪代码)
for i = 0 to i = n:
word = generateWord();
FileWriter.println(word);
end loop
对
String [] listOfWords = new List
for i = 0 to i = n:
word = generateWord();
listOfWords.add(word)
end loop
for i = 0 to n:
FileWriter.println(listOfWords[i]);
end loop
【问题讨论】:
标签:
java
c++
file-io
disk
【解决方案1】:
您展示的这两种方法在磁盘使用效率方面完全一样。
在考虑磁盘写入速度时,您必须始终考虑您使用的是哪种写入器对象。有许多类型的写入器对象,在实际磁盘写入时,它们中的每一种都可能表现不同。
如果您正在使用的对象是那些写入您告诉它的确切数据的对象之一,那么您的写入方式非常低效。您应该考虑切换到另一个写入器(例如 BufferedWriter)或在写入之前构建更长的字符串。
一般来说,您应该尝试将数据写入适合磁盘块大小的块。
【解决方案2】:
在您的代码和磁盘之间,您有一个类似于以下内容的堆栈:Java 库代码、虚拟机运行时、C 运行时库、操作系统文件缓存/虚拟内存子系统、操作系统 I/O 调度程序、设备驱动程序和物理磁盘固件。
只要做最简单的事情,除非分析显示有问题。其中几个层已经被调整为处理缓冲、批处理和调度顺序写入,因为它们是如此常见的用例。
【解决方案3】:
从FileWriters 的角度来看,您在两个示例中都在做完全相同的事情,因此显然文件 I/O 没有任何区别。而且,正如您所说,第一个的空间复杂度是 O(1),而第二个的空间复杂度是 O(N)。