我今天为 Linux 编写了我的第一个 Dart 命令行实用程序。它应该处理通过标准输入传送到它的文件。最终,然后处理每一行。但是我觉得我使用了一种非常低效的方式来读取文件,所以我希望得到一些提示。这是代码的最小示例:
import 'dart:io';
void main(){
var line = stdin.readLineSync();
for (;line != null; line = stdin.readLineSync() ) {
//do stuff with line or simply
stdout.writeln(line);
}
}
然后像这样使用:
zcat some_data.csv.gz | ./my_dart_tool.exe > output_file.csv
这是在 Dart 中迭代 stdin 的合理方法还是应该以不同的方式完成?
感谢您的帮助!
性能不佳stdin.readLineSync
是一个已知问题,这里的 Dart SDK 问题跟踪器上有 GitHub 问题:https : //github.com/dart-lang/sdk/issues/45255
问题是 Dart 不想读取不必要的数据,因此它尝试一次读取一个字节,直到找到换行符。这不是很有效,因为这增加了原生层和 Dart 代码之间的大量通信。
在解决此问题之前,解决方法是执行以下操作:
import 'dart:convert';
import 'dart:io';
void main() async {
await for (final line in stdin.transform(utf8.decoder).transform(const LineSplitter())) {
//do stuff with line or simply
print(line);
}
}
在这里,我们改为读取缓冲区内的一堆字节utf8.decode
,然后使用它进行转换,然后将其发送到LineSplitter
返回行中。这是更有效的,因为我们可以减少读取的次数,stdin
因为我们每次请求时都会读取更多的数据。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句