如何有效地迭代 Dart 中的 stdin?

堆栈搜索器

我今天为 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 的合理方法还是应该以不同的方式完成?

感谢您的帮助!

julemand101

性能不佳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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何有效地用完Oneliner中的迭代器?

如何从 dart 中的 stdin 输入开始处理和读取参数?

如何有效地从数字向量中采样

如何有效地弯曲列表中的项目?

如何有效地从列表中删除

如何有效地搜索列表中的项目?

如何有效地比较Swift中的字符

如何有效地引用Excel中的整行?

如何有效地在Spritekit中暂停游戏?

我怎样才能有效地从Go中的stdin中读取数字(或为什么fmt.Scanf如此低效)

如何有效地迭代NSSet(Objective-C)-核心数据中的多对多关系表示?

在Dart中获取非阻塞的stdin数据

在Flutter / Dart中有效地解析JSON

最有效地迭代Python中的大词典列表

如何有效地将数据异步异步地填充到winform DataGridView中?

如何用另一个std :: string的迭代值有效地替换std :: string中的字符?

如何有效地从Scala的ListBuffer中删除所有元素?

如何有效地从具有特定值模式的字典中删除元素?

如何有效地从Rails的大表中获取所有行?

如何有效地在具有不同维度的多维numpy数组中添加列?

如何使用Hibernate有效地从表中获取所有行?

如何有效地合并字典中的所有列表?

如何有效地生成所有可能的坐标对而不在numpy中重复

如何使用Spark有效地检查列中的所有值?

如何有效地从所有组合中随机选择多个组合

如何有效地检测PDF中的所有空白页?

如何有效地从Java中的LinkedHashMap中删除条目?

如何有效地获取python列表中列表中项目的计数

当python中的相似元素时如何有效地组合列表中的元组