【问题标题】:Sort for a large number of string record by time in Java在Java中按时间对大量字符串记录进行排序
【发布时间】:2018-08-25 01:52:09
【问题描述】:

我有一个包含数百万行记录的 CSV,我喜欢按时间对其进行排序。目前,我只是把它放在一个以ZonedDateTime 为键的树形图中。有没有更好的方法来做到这一点?猜猜至少最好使用toEpochSecond() 并使用 EpochSecond 作为密钥?是否有进一步改善?

时间在 CSV 中的一个字段中,下面是一个示例:

ABC.DE,,Market Price,2018-07-19T08:21:32.633494851+01,Quote,,,,,19.01,425,,,21.09,250,,,298911,21:32.6,,,,,,,,,, 

【问题讨论】:

  • 如果按时间排序,以什么方式?您从每一行读取的行或某个 DateTime 字段中读取的时间?
  • 您能给我们一份该 csv 的样本吗?
  • 可能没有更好的方法。您可以尝试使用 Longs 而不是 ZonedDateTimes 作为键,但如果没有显着的速度提升,我会继续使用 ZonedDateTimes,因为代码会更清晰。
  • 你能放一个CSV文件的样本吗?
  • 如果您没有遇到任何问题,您所拥有的一切都很好。如果您确实有性能或其他方面的问题,请告诉我们,我们可以进行改进。

标签: java performance sorting memory timestamp


【解决方案1】:

对于排序,请使用 sort。有 Arrays::sortCollections::sort(还有 sorted 用于流)。

顺便说一句,如果时间重复,我需要稍微调整一下时间,否则记录会丢失。不确定是否有其他方法可以使用更少的内存,或者更快,或者不需要确保时间是不同的。

当然,普通的sort 不需要时间来区分。它很可能需要更少的内存并且速度更快。

对于非常庞大的数据,您可以进行某种文件合并排序,这样您就无需将其全部保存在内存中。但是,当你有这么多内存时,就没有什么可得到的了,不是吗?

猜猜至少使用 toEpochSecond() 并使用 EpochSecond 作为 key 更好?

也许吧。或者自己保存所有的解析和对字符串进行排序。假设您在所有地方都使用相同的时区,那么无论您将其视为日期时间还是字符串,2018-07-19T08:21:32.633494851+01 都会进行相同的比较。

【讨论】:

  • 设计一个包含两个字段的类,时间和 CSV 行。按时间对此类的实例进行排序。由于时间不会排在第一位,因此将行排序为文本不会给您想要的结果。此外,对时间字符串进行排序不仅需要相同的偏移量,而且秒上的小数位数也相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-09
  • 2012-10-14
  • 1970-01-01
  • 2015-10-16
  • 2016-07-18
  • 1970-01-01
相关资源
最近更新 更多