Python 解析巨大的文本文件,并在每一行上标识分隔不好的列

Python 解析巨大的文本文件,并在每一行上标识分隔不好的列,python,sql,regex,database,pandas,Python,Sql,Regex,Database,Pandas,我正在解析巨大的文本文件,每个3GB,有数百万行。 我正在使用pandas的read_表(包括迭代器)读取文件,但没有指定分隔符,因为sep=不断给我以下错误: CParserError:标记数据时出错 一个典型的行,例如: <www.blabla.com> <mmm> "Hello" <A.C> . 但它变得复杂了,因为外部的文本或文本必须被忽略。有时引号内有双引号,用反斜杠转义,有时括号被替换为ux:mexx,原因我不明白,但在这种情况下,它是重要的

我正在解析巨大的文本文件,每个3GB,有数百万行。 我正在使用pandas的read_表(包括迭代器)读取文件,但没有指定分隔符,因为sep=不断给我以下错误:

CParserError:标记数据时出错

一个典型的行,例如:

 <www.blabla.com> <mmm> "Hello" <A.C> .
但它变得复杂了,因为外部的文本或文本必须被忽略。有时引号内有双引号,用反斜杠转义,有时括号被替换为ux:mexx,原因我不明白,但在这种情况下,它是重要的

将上述条件写入函数会使脚本速度非常慢。我花了两个多小时处理了1000万行,我必须处理大约2亿行

我的目标不是文本本身,而是计算每行上的元素。 可能是三个或四个。因此,我决定只使用本机函数,避免应用。以下是迄今为止的相关代码:

tdf = pd.DataFrame(columns = ['TOPIC', 'COUNTER'])
chunkk = 50000
for ii, f in enumerate(files):
    reader = pd.read_table(f, header=None,  chunksize = chunkk)
    for df in reader:
        df = df[0].str.split(" ", expand=True)
        df['TOPIC'] = df[0] #first element retrieved from split
        # count here across the row the number of elements
        tdf = tdf.append(df[['TOPIC', 'COUNTER']], ignore_index=True)

    tdf = tdf.groupby('TOPIC', as_index=False).sum()
    i += chunkk
    print("Completed " + str(i) + " rows from file #" + str(ii +1))
我想我需要使用.countaxis=1,但我不确定如何使用。查看熊猫文档 我认为正则表达式可能是一个关键的解决方案

任何关于如何计算有效元素数量的建议都将不胜感激。另外,任何让代码运行更快的建议都是非常好的。
使用数据库和SQL可能有更好的方法,因此我在下面对它们进行标记。

我看到了一些您可能有的选项。我不确定哪一个最适合你。我想用Pyspark进行分发和处理可能是我的假设。然而

我不确定把它放进SQL数据库会给你什么。您仍然需要解析数据并对其进行处理,因此即使我们可以优化查询,您也会遇到其他问题

您可能想仔细看看磁盘访问与内存。如果文件足够小,可以很容易地放入内存中,那么通过读取整个文件,然后逐行处理,可以获得更好的性能。这将提高磁盘I/O的性能,但内存成本很高

您可以在Pyspark中分发、立即加载和处理。这可能是最好的选择,因为您只需分析数据并获得回复

tdf = pd.DataFrame(columns = ['TOPIC', 'COUNTER'])
chunkk = 50000
for ii, f in enumerate(files):
    reader = pd.read_table(f, header=None,  chunksize = chunkk)
    for df in reader:
        df = df[0].str.split(" ", expand=True)
        df['TOPIC'] = df[0] #first element retrieved from split
        # count here across the row the number of elements
        tdf = tdf.append(df[['TOPIC', 'COUNTER']], ignore_index=True)

    tdf = tdf.groupby('TOPIC', as_index=False).sum()
    i += chunkk
    print("Completed " + str(i) + " rows from file #" + str(ii +1))