gpt4 book ai didi

python - 在 Python 中处理大文件 [1000 GB 或更多]

转载 作者:IT老高 更新时间:2023-10-28 21:15:08 26 4
gpt4 key购买 nike

假设我有一个 1000 GB 的文本文件。我需要找出一个短语在文本中出现的次数。

有没有比我下面使用的更快的方法来做到这一点?完成任务需要多少时间。

phrase = "how fast it is"
count = 0
with open('bigfile.txt') as f:
for line in f:
count += line.count(phrase)

如果我是对的,如果我在内存中没有这个文件,我会等到每次我进行搜索时 PC 加载文件,这对于 250 MB/秒的硬盘至少需要 4000 秒驱动器和 10000 GB 的文件。

最佳答案

我使用 file.read() 以 block 的形式读取数据,在当前示例中, block 的大小分别为 100 MB、500MB、1GB 和 2GB。我的文本文件大小为 2.1 GB。

代码:

 from functools import partial

def read_in_chunks(size_in_bytes):

s = 'Lets say i have a text file of 1000 GB'
with open('data.txt', 'r+b') as f:
prev = ''
count = 0
f_read = partial(f.read, size_in_bytes)
for text in iter(f_read, ''):
if not text.endswith('\n'):
# if file contains a partial line at the end, then don't
# use it when counting the substring count.
text, rest = text.rsplit('\n', 1)
# pre-pend the previous partial line if any.
text = prev + text
prev = rest
else:
# if the text ends with a '\n' then simple pre-pend the
# previous partial line.
text = prev + text
prev = ''
count += text.count(s)
count += prev.count(s)
print count

时间安排:

read_in_chunks(104857600)
$ time python so.py
10000000

real 0m1.649s
user 0m0.977s
sys 0m0.669s

read_in_chunks(524288000)
$ time python so.py
10000000

real 0m1.558s
user 0m0.893s
sys 0m0.646s

read_in_chunks(1073741824)
$ time python so.py
10000000

real 0m1.242s
user 0m0.689s
sys 0m0.549s


read_in_chunks(2147483648)
$ time python so.py
10000000

real 0m0.844s
user 0m0.415s
sys 0m0.408s

另一方面,简单循环版本在我的系统上大约需要 6 秒:

def simple_loop():

s = 'Lets say i have a text file of 1000 GB'
with open('data.txt') as f:
print sum(line.count(s) for line in f)

$ time python so.py
10000000

real 0m5.993s
user 0m5.679s
sys 0m0.313s

@SlaterTyranus 的 grep version 的结果在我的文件上:

$ time grep -o 'Lets say i have a text file of 1000 GB' data.txt|wc -l
10000000

real 0m11.975s
user 0m11.779s
sys 0m0.568s

@woot 的 solution 的结果:

$ time cat data.txt | parallel --block 10M --pipe grep -o 'Lets\ say\ i\ have\ a\ text\ file\ of\ 1000\ GB' | wc -l
10000000

real 0m5.955s
user 0m14.825s
sys 0m5.766s

当我使用 100 MB 作为 block 大小时获得了最佳时机:

$ time cat data.txt | parallel --block 100M --pipe grep -o 'Lets\ say\ i\ have\ a\ text\ file\ of\ 1000\ GB' | wc -l
10000000

real 0m4.632s
user 0m13.466s
sys 0m3.290s

woot 的 second solution 的结果:

$ time python woot_thread.py # CHUNK_SIZE = 1073741824
10000000

real 0m1.006s
user 0m0.509s
sys 0m2.171s
$ time python woot_thread.py #CHUNK_SIZE = 2147483648
10000000

real 0m1.009s
user 0m0.495s
sys 0m2.144s

系统规范:Core i5-4670、7200 RPM HDD

关于python - 在 Python 中处理大文件 [1000 GB 或更多],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23765360/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com