Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
运行时关键型,C中CSV文件的读取操作_C_File_Csv - Fatal编程技术网

运行时关键型,C中CSV文件的读取操作

运行时关键型,C中CSV文件的读取操作,c,file,csv,C,File,Csv,有没有一种方法可以编写一种快速、高效的读取csv文件的方法?[这里要注意的是:我说的是一个有一百万行以上行的csv文件] 运行时间是这里的关键指标 internet上的一个资源集中于使用二进制文件操作进行批量读取。但我相信,如果它在阅读CSV文件时会有所帮助 还有其他方法,比如Robert Gamble编写的SourceForge代码。有没有一种方法可以使用本机函数编写它 编辑:让我们以更清晰、更好的方式拆分整个问题: 是否有一种高效(运行时关键型)的方法来读取C中的文件?(在本例中为百万行长的

有没有一种方法可以编写一种快速、高效的读取csv文件的方法?[这里要注意的是:我说的是一个有一百万行以上行的csv文件]

运行时间是这里的关键指标

internet上的一个资源集中于使用二进制文件操作进行批量读取。但我相信,如果它在阅读CSV文件时会有所帮助

还有其他方法,比如Robert Gamble编写的SourceForge代码。有没有一种方法可以使用本机函数编写它

编辑:让我们以更清晰、更好的方式拆分整个问题:

  • 是否有一种高效(运行时关键型)的方法来读取C中的文件?(在本例中为百万行长的.csv文件)

  • 是否有一种快速有效的方法来解析csv文件


  • 没有一种方法可以读取和解析任何类型的文件,这种方法总是最快的。但是,您可能希望为CSV构建语法;这些往往是相当快的。您可以根据特定类型的CSV(逗号分隔,
    -分隔,仅限数字等)对其进行调整,也可以跳过不打算使用的任何数据。我对特定于数据集的SQL解析器有很好的经验,这些解析器可以跳过大部分输入(数据库转储)


    批量读取可能是一个好主意,但您应该在实际数据上衡量它是否真的比stdio快。在Windows上使用二进制I/O可能会加快一点速度,但是您需要在其他地方处理换行符。

    根据我的经验,CSV文件的解析(即使是在更高级的解释语言中)通常不是瓶颈。通常,海量数据占用大量空间;CSV文件很大,大部分加载时间都是I/O,也就是说,硬盘驱动器将大量数字读入内存

    所以我强烈的建议是考虑压缩CSV。code>gzip非常有效地完成了它的工作,它能够动态压缩和恢复CSV流,通过大大减少文件大小和I/O时间来加快保存和加载速度


    如果您是在Unix下开发的,您可以尝试使用此方法,而不需要任何额外的代码,通过
    gzip-c
    gunzip-c
    管道CSV输入和输出将受益匪浅。试一试——对我来说,它将速度提高了几十倍。

    使用
    setvbuf
    将输入缓冲区设置为比默认值大得多的大小。这是在C中唯一可以提高读取速度的方法。还要做一些定时测试,因为会有一个收益递减点,超过这个点就没有必要增加缓冲区大小


    在C之外,您可以将该.CSV文件放入SSD驱动器,或者将其存储在压缩文件系统中

    最好的方法是将大块文本拖入内存(或“内存映射”文件),然后在内存中处理文本

    效率的症结在于文本行是可变长度的记录。通常,文本会一直读取到找到行结束符为止。通常,这意味着读取字符并检查eol。许多平台和库试图通过读取数据块并搜索数据以查找eol来提高效率

    您的CSV格式使问题更加复杂。在CSV文件中,字段是可变长度的记录。同样,搜索终端字符,如逗号、制表符或竖线

    如果希望获得更好的性能,则必须将数据布局更改为固定字段长度和固定记录长度。如有必要,请填充字段。应用程序可以删除额外的填充。就读取而言,定长记录非常有效。只需读取N个字节。无需扫描,只需将其转储到某个缓冲区中即可

    固定长度字段允许随机访问记录(或文本行)。字段中的索引是常量,并且可以轻松计算。不需要搜索

    总之,可变长度记录和字段本质上不是最有效的数据结构。搜索终端字符会浪费时间。固定长度记录和固定长度字段更有效,因为它们不需要搜索


    如果您的应用程序是数据密集型的,那么重构数据可能会使程序更高效。

    是的,我想,我的问题格式不对。解析并不像I/O那样是一个巨大的瓶颈。是否有一些示例代码是如何使用gzip来实现更快的i/o的?从一个假设的输出巨大CSV的
    test.c
    开始,您可以将其编译为
    test
    ,并测量有无压缩的速度:
    time test | gzip-c>test.CSV.gz
    time test>test.CSV
    。如果不使用Unix,则必须搜索并合并一些gzip处理代码。我不认为我可以在这个特定的时间使用它(因为代码将运行在机器上,而不是我的机器上,因此可能需要在那里安装ragel)。我还没有给ragel一个完整的dekko,但它看起来确实很有趣。有没有其他方法可以达到同样的效果?@Soham:你只需要在开发机器上安装ragel。它编译为C代码,没有进一步的依赖关系。Lex/Yacc提供相同的功能。重要的是,是否可以使用汇编来提高性能???我没有提到组合,因为我没有意识到它可能很重要,但为了清楚起见,让我们假设它是1000万行x 6列的双倍。这样,是否可以假设线的长度是一致的?