Swift:高效处理大型文本文件

时间:2016-02-29 12:11:07

标签: python swift performance csv text-files

我有一个CSV类型的Unicode文本文件,实际上包含两个浮点值(xy),一个int(i)和两个字符串({{1每行和s)。这些行按第一个浮点值排序,但我还没有使用它。

任务是提取具有指定范围(txmin < x < xmax)中浮点值的所有行。想想对周围物品的几何搜索。

由于文件相当大(130万行,67 MB),我不想一次将其读入内存。相反,我使用了提供hereymin < y < ymax类。

对于性能测试,我实现了几个不同的功能:

  1. 逐行读取文件,完全忽略内容(只计算行数)
  2. 相同,但实际上过滤了匹配的行(A)
  3. 相同,但过滤器(B)
  4. 逐行读取文件并将每一行存储为数组元素(Swift StreamReader / Python元组)
  5. 使用数组,按浮动比较过滤
  6. 过滤(A)通过字符串比较完成,而不是首先将字符串值转换为浮点数。过滤(B)进行浮点转换和浮点比较。根据需要进行转换/比较,即仅处理struct;仅当x已匹配时才会处理y

    在iMac上测试我的功能时,我得到以下结果(约):

    默认调试配置(无优化):

    1. 450k行/秒
    2. 120k行/秒
    3. 45k行/ s
    4. 18k line / s;构建的阵列需要300 MBytes
    5. 3480k条/ s
    6. 默认发布配置(优化的-Os):

      1. 780k line / s(因子:1.7到Swift_Debug)
      2. 130k行/ s(因子:1.1)
      3. 68k line / s(因子:1.5)
      4. 20k行/ s(因子:1.1)
      5. 208000k条/ s(!)(因子:59.8)
      6. 为了比较,在Python中做同样的事情产生:

        1. 8140k行/秒(因子:10到Swift_Release)
        2. 4430k line / s(factor:34)
        3. 2010k行/秒(因子:30)
        4. 710k行/秒(因子:36);该阵列需要330 MBytes
        5. 9980k条目/秒(因子:0.05!)
        6. 可在此处找到源文字:SwiftPython

          性能限制约为2000k line / s(即提取应在<1秒内完成)。

          很难相信编译的Swift程序比解释的Python脚本(实际上是字节代码)慢得多,重要的例外是本地计算的运行。

          如何改善Swift计划的糟糕表现?有没有人获得过这类问题的经验?

          通常可以采取哪些措施来提高功能效率?

          • 也许x实施效果不尽如人意?
          • 我可以考虑使用固定长度的数字字段来避免扫描字段分隔符
          • 或者将数值以压缩形式存储在文本文件中。
          • StreamReader值超过匹配间隔时结束扫描,平均时间可减半。
          • 通过搜索文件并使用二分算法搜索间隔可以提高效率。
          • 或按x导航值对文件编制索引。
          • 甚至咬紧牙关并将数据结构保存在内存中 - 但转移到iOS时这可能会变得不那么实用。
          • 依赖于上下文,将文件分成几个子文件也是合适的。
          • 使用SQLite怎么样?

0 个答案:

没有答案