Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.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
分析非二进制的大文件(Python或C+;+;)_Python_C++_Parsing_Ascii_Bigdata - Fatal编程技术网

分析非二进制的大文件(Python或C+;+;)

分析非二进制的大文件(Python或C+;+;),python,c++,parsing,ascii,bigdata,Python,C++,Parsing,Ascii,Bigdata,作为免责声明,我几乎不是一名计算机科学家,但我一直在阅读有关高效文件I/o的所有内容,以尝试解决我正在从事的项目的这一方面 我有一个非常大的(10-100GB)的逗号分隔值日志文件,需要解析。第一个值将其标记为“A”或“B”;对于每个“A”行,我需要检查它前面的行和后面的行,如果它前面的行或后面的行符合条件,我希望将其存储在内存中或写入文件。这些线条大小不一致 这就是我的具体问题:我似乎找不到在非二进制文件中执行此操作的有效方法。对于二进制文件,我只需在该文件上迭代一次,然后通过逻辑检查来回回放

作为免责声明,我几乎不是一名计算机科学家,但我一直在阅读有关高效文件I/o的所有内容,以尝试解决我正在从事的项目的这一方面

我有一个非常大的(10-100GB)的逗号分隔值日志文件,需要解析。第一个值将其标记为“A”或“B”;对于每个“A”行,我需要检查它前面的行和后面的行,如果它前面的行或后面的行符合条件,我希望将其存储在内存中或写入文件。这些线条大小不一致

这就是我的具体问题:我似乎找不到在非二进制文件中执行此操作的有效方法。对于二进制文件,我只需在该文件上迭代一次,然后通过逻辑检查来回回放。我已经研究过内存映射,但它似乎是针对二进制文件构建的;我当前的代码是Pythonic的,运行需要数周时间[请参阅免责声明]

我的另一个问题是——在这里调用并行性有多容易?我有一个概念--一次映射出三行文件,并将每个块发送到每个节点[第1、2、3行发送到一个节点;第3、4、5行发送到另一个节点…],但我不知道如何实现这一点


如果有任何帮助,我们将不胜感激。

请在循环中阅读这些行。跟踪内存中的前一行,并在需要时检查它

伪代码:

for each line:
    previousLine := currentLine
    read currentLine from file
    do processing...
假设您已经将每一行都读入内存,并且使用了适当的缓冲方案来读取文件(一次将大数据块读入内存),那么这是非常有效的

我认为并行性在这种情况下不会有帮助。如果编写正确,程序的瓶颈应该是磁盘I/O,多个线程/进程从磁盘读取数据的速度不能比单个线程快。并行性只会改善CPU受限的问题


对于它的价值,您可以用与二进制文件相同的方式在ASCII文件中“查找”。每次开始读取一行时,您只需跟踪文件偏移量,并存储该偏移量,以便知道以后在何处查找。但是,根据实现方式的不同,它的性能永远不会比上面的更好,有时甚至更差(您可能希望将文件数据缓冲在内存中,以便“查找”是一个内存操作,而不是磁盘操作;您肯定希望按顺序读取文件内容,以最大限度地提高缓存提前的好处).

只要读循环中的行就行了。跟踪内存中的前一行,并在需要时检查它

伪代码:

for each line:
    previousLine := currentLine
    read currentLine from file
    do processing...
假设您已经将每一行都读入内存,并且使用了适当的缓冲方案来读取文件(一次将大数据块读入内存),那么这是非常有效的

我认为并行性在这种情况下不会有帮助。如果编写正确,程序的瓶颈应该是磁盘I/O,多个线程/进程从磁盘读取数据的速度不能比单个线程快。并行性只会改善CPU受限的问题


对于它的价值,您可以用与二进制文件相同的方式在ASCII文件中“查找”。每次开始读取一行时,您只需跟踪文件偏移量,并存储该偏移量,以便知道以后在何处查找。但是,根据实现方式的不同,它的性能永远不会比上面的更好,有时甚至更差(您可能希望将文件数据缓冲在内存中,以便“查找”是一个内存操作,而不是磁盘操作;您肯定希望按顺序读取文件内容,以最大限度地提高缓存提前的好处).

只要读循环中的行就行了。跟踪内存中的前一行,并在需要时检查它

伪代码:

for each line:
    previousLine := currentLine
    read currentLine from file
    do processing...
假设您已经将每一行都读入内存,并且使用了适当的缓冲方案来读取文件(一次将大数据块读入内存),那么这是非常有效的

我认为并行性在这种情况下不会有帮助。如果编写正确,程序的瓶颈应该是磁盘I/O,多个线程/进程从磁盘读取数据的速度不能比单个线程快。并行性只会改善CPU受限的问题


对于它的价值,您可以用与二进制文件相同的方式在ASCII文件中“查找”。每次开始读取一行时,您只需跟踪文件偏移量,并存储该偏移量,以便知道以后在何处查找。但是,根据实现方式的不同,它的性能永远不会比上面的更好,有时甚至更差(您可能希望将文件数据缓冲在内存中,以便“查找”是一个内存操作,而不是磁盘操作;您肯定希望按顺序读取文件内容,以最大限度地提高缓存提前的好处).

只要读循环中的行就行了。跟踪内存中的前一行,并在需要时检查它

伪代码:

for each line:
    previousLine := currentLine
    read currentLine from file
    do processing...
假设您已经将每一行都读入内存,并且使用了适当的缓冲方案来读取文件(一次将大数据块读入内存),那么这是非常有效的

我认为并行性在这种情况下不会有帮助。如果编写正确,程序的瓶颈应该是磁盘I/O,多个线程/进程从磁盘读取数据的速度不能比单个线程快。并行性只会改善CPU受限的问题


对于它的价值,您可以用与二进制文件相同的方式在ASCII文件中“查找”。每次开始读取一行时,您只需跟踪文件偏移量,并存储该偏移量,以便知道以后在何处查找。但是,根据实现方式的不同,它的性能永远不会比上面的更好,有时甚至更差(您可能希望将文件数据缓冲在内存中,以便“查找”是一个内存操作,而不是磁盘操作;您肯定希望按顺序读取文件内容,以最大限度地提高缓存提前的好处).

这是第一关。假定赞成