【问题标题】:What is the efficient way of reading and processing very large CSV file in scala (> 1GB)?在scala(> 1GB)中读取和处理非常大的CSV文件的有效方法是什么?
【发布时间】:2016-07-23 17:57:53
【问题描述】:

在 Scala 中,您如何有效地(内存消耗 + 性能)读取非常大的 csv 文件?是否足够快以逐行流式传输并在每次迭代中处理每一行?

我需要用 CSV 数据做什么:-> 在我的应用程序中,CSV 文件中的单行被视为一条记录,CSV 文件的所有记录都将转换为 XML 元素和 JSON 格式,并以 xml 和 json 格式保存到另一个文件中。

所以这里的问题是,在从 csv 读取文件时,以块的形式读取文件并将该块提供给另一个线程,该线程会将 CSV 记录转换为 xml/json 并将 xml/json 写入文件?如果是怎么办?

CSV 的数据可以是任何数据,数据的类型没有限制,可以是数字、大十进制、字符串或日期。在将其保存到 xml 之前,有什么简单的方法可以处理这种不同的数据类型?或者我们不需要处理类型?

非常感谢

【问题讨论】:

  • 你的问题的标题与问题本身无关,那么你到底有什么问题?
  • 好的,让我在编辑中说得更清楚
  • 假设转换不需要太多时间(根据您的描述,它们不需要)。时间将完全由文件 I/O 控制。所以这将取决于你如何做到这一点。假设您使用一些缓冲读写,那么您如何构建其余部分实际上并没有任何区别(您可以使用异步写入来允许您在等待写入完成时处理缓冲区的价值,但这只会为您节省一个缓冲区大小的总体转换时间。
  • 另外,1Gb 并不大。它适合大多数计算机的内存。因此,您可能可以将其全部读入,将其全部处理为内存中的 JSON 和 XML,然后将其作为两次单次写入写出,每种输出类型一次。也许你可以重叠这些。
  • 好的,知道了。另一点是我的 CSV 可能有任何类型的数据,比如文本中可能有双引号、单引号、逗号、数字、小数。我将如何处理所有这些情况?

标签: json xml scala csv


【解决方案1】:

如果这不是一次性任务,请创建一个程序,将这个 1GB 文件分成小文件。然后提供这些新文件作为单独期货的输入。 每个未来都会读取一个文件并按照文件内容的顺序进行解析。 File4 在 File3 之后解析,File3 在 File2 之后解析,在 File1 之后解析。 由于该文件没有键值对或分层数据结构,所以我建议,直接读取为字符串。 希望这会有所帮助。

【讨论】:

  • 如果您使用 Futures 处理较小的块,您将如何控制排序?
  • 你可以让 future oncomplete { 现在在这里调用另一个 future 来读取下一个文件,在这方面你可以再次执行 OnComplete。或者您将所有期货添加到 List[Future] 中,然后调用 future.sequence。
猜你喜欢
  • 2014-02-01
  • 2014-02-11
  • 2019-01-30
  • 2012-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-20
  • 1970-01-01
相关资源
最近更新 更多