反复检查一个巨大的lis

2024-04-19 04:16:27 发布

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

我的电脑里保存了大约100000个网址。(这10万个链接可以很快增加到几百万个。)对于每个url,我检查该网页并收集该网页上的所有其他url,但前提是每个附加链接都不在我的大列表中。这里的问题是迭代地将这个巨大的列表重新加载到内存中,这样我就可以始终得到一个准确的列表。使用的内存量可能很快就会变得太多,更重要的是,重新加载列表之间的时间会变长,这严重阻碍了项目的进度。你知道吗

我的列表以几种不同的格式保存。一种格式是将所有链接包含在一个文本文件中,我打开(filetext).readlines()将其直接转换为列表。我保存的另一种似乎更有用的格式是保存一个包含所有链接的文件夹树,然后使用os.步行(路径)。你知道吗

我真的不确定有没有其他方法可以更有效地执行这个循环条件检查,而不必使用荒谬的内存和加载时间。我也尝试过使用队列,但是能够看到这些链接的文本输出是一个很大的好处,因此队列变得异常复杂。我还能从哪里开始呢?你知道吗


Tags: 项目内存url网页列表队列链接格式
3条回答

记忆不应该是个问题。如果每个url需要1kb存储在内存中(非常慷慨),那么100万个url将是1gb。你说你有8吉布的公羊。你知道吗

您可以将已知的url保存在^{}中的内存中,并使用innot in检查包含性。Python的set使用散列,因此对包含的搜索是O(1),这通常比list的线性搜索快得多。你知道吗

您可以递归地刮取页面:

def main():
    with open('urls.txt') as urls:
        known_urls = set(urls)

    for url in list(known_urls):
        scrape(url, known_urls)


def scrape(url, known_urls):
    new_urls = _parse_page_urls(url)
    for new_url in new_urls:
        if new_url not in known_urls:
            known_urls.add(new_url)
            scrape(new_url, known_urls)

主要的问题是不在内存中加载列表。这应该只做一次,在开始之前,取消网页。问题是要找出一个元素是否已经在列表中。in操作对于大列表来说太长。你知道吗

你应该试着研究几种想法,其中setspandas。第一个可能是最佳解决方案。你知道吗

现在,既然你想用一个文件夹树和URL作为文件夹名,我可以想出一个更快的方法。不要用os.walk(path)创建列表,而是尝试查看文件夹是否已经存在。如果没有,这意味着你还没有那个网址。这基本上是一个假的图形数据库。为此,可以使用函数os.path.isdir()。如果你想要一个真正的图形数据库,你可以看看OrientDB的例子。你知道吗

你考虑过把IP地址表映射到URL吗?当然,这将只工作,如果你正在寻找唯一的领域与数千页在同一个领域。这样做的好处是可以处理12个整数的地址。缺点是需要额外的表格数据结构和额外的过程来映射数据。你知道吗

相关问题 更多 >