【发布时间】:2015-11-03 04:03:55
【问题描述】:
以下代码在给定一个中等大的文件 (251MB) 作为输入时崩溃并出现错误 core.exception.InvalidMemoryOperationError@(0),但在给定小文件时则不会。
import std.stdio;
void main(string[] argv) {
foreach(line; stdin.byLine()) {}
}
我找到的所有文档 [例如1, 2] 表明在垃圾回收周期中发生分配时会发生此错误(例如,如果在析构函数中分配内存)。但是这里唯一应该分配的是line,它的类型是char[],大概没有析构函数。
此外,由于调用 popFront() 后 byLine() 返回的值不应该持续存在 [3],我很好奇为什么它甚至分配足够的内存来 需要 收集通行证。使用 byLine 而不是 byLineCopy 的重点不就是重用缓冲区的能力,只在必要时增加它吗?
我的编译器版本是DMD64 D Compiler v2.067.1
【问题讨论】:
-
您正在以文本形式传输的文件,例如UTF-8 文件?我不得不问,因为,这似乎很奇怪。我看了看代码,真的只是看起来很时髦。
-
纯 ASCII 文本,行长不超过 5905 字节。
-
无法在此处重现 (linux DMD64 2.069)。您是否将输入通过另一个过程(如 Richard A.C 所建议的那样)?如果是这样,进程很有可能必须关闭输入(例如启动进程 A,写入进程 A 输入,关闭进程 A 输入)。在控制台(例如
./test < input.txt)中没有错误。 -
可以发一下文件内容吗?
-
嵌套类型,没有其他进程;我只是将文件重定向到标准输入。鲍斯,文件是 251MB,所以不是。升级到 2.068.2 修复了它,所以它看起来像是 2.067.1 编译器中的一个错误。 (也可能在早期版本中;该错误仅表现在大文件上。例如,它在旧编译器的 2MB 输入上运行良好,因此嵌套类型的测试并不能最终表明它在所有情况下都适用于 2.069。 )
标签: garbage-collection d