分析巨大的文本文件,并在每个文件上标识分隔不好的列

2024-06-28 19:17:04 发布

您现在位置:Python中文网/ 问答频道 /正文

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

CParserError: Error tokenizing data

一个典型的行,例如:

 <www.blabla.com> <mmm> "Hello" <A.C> .

我编写了一个函数,它将返回一个包含以下元素的列表:

 www.blabla.com     mmm    Hello    A.C

但它变得很复杂,因为必须忽略<;gt;或“”之外的文本。有时引号中有双引号,用反斜杠(\“”)转义,有时括号被u2;:mexx替换,原因很神秘,我不明白,但在这种情况下,它很重要。你知道吗

将上述条件写入函数会使脚本速度非常慢。我花了两个多小时来处理一千万行,我必须处理大约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))

我想我需要使用.count(axis=1),但我不知道怎么做。查看熊猫文档http://pandas.pydata.org/pandas-docs/stable/text.html 我认为正则表达式可能是一个关键的解决方案。你知道吗

任何关于如何计算有效元素数量的建议都将受到极大的赞赏。另外,任何让代码运行得更快的建议都是很好的。 可能有更好的方法使用数据库和SQL来实现它,所以我在下面标记它们。你知道吗


Tags: 函数文本com元素hellopandasdfread
1条回答
网友
1楼 · 发布于 2024-06-28 19:17:04

我看你有几个选择。我不知道哪一个最适合你。我想用Pyspark分发和处理可能是我的假设。然而。。。。。你知道吗

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

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

  3. 您可以在Pyspark中分发、立即加载和处理。这可能是最好的选择,因为您只需要分析数据并得到答案,

相关问题 更多 >