Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.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 如何加快大文件的文件写入过程?_Python_Multiprocessing - Fatal编程技术网

Python 如何加快大文件的文件写入过程?

Python 如何加快大文件的文件写入过程?,python,multiprocessing,Python,Multiprocessing,下面的代码从一个大文本文件中随机抽取若干行,并将原始的大文件分成两部分。它非常慢,在最后一个“for”循环中,将文本写入两个文件。有没有一种方法可以通过使用多处理模块来加快速度?我是新来的 以open('bigfile.txt','r')作为f\ 打开('split1.txt','w'),作为\ 打开('split2.txt','w')作为b: 所有_行=f.读取行() 尺寸=长度(所有线) 打印(“总尺寸:”,str(尺寸)) 行数=[] 对于范围内的i(尺寸): 行号。追加(i) 随机样本行

下面的代码从一个大文本文件中随机抽取若干行,并将原始的大文件分成两部分。它非常慢,在最后一个“for”循环中,将文本写入两个文件。有没有一种方法可以通过使用多处理模块来加快速度?我是新来的

以open('bigfile.txt','r')作为f\
打开('split1.txt','w'),作为\
打开('split2.txt','w')作为b:
所有_行=f.读取行()
尺寸=长度(所有线)
打印(“总尺寸:”,str(尺寸))
行数=[]
对于范围内的i(尺寸):
行号。追加(i)
随机样本行数=随机列表(行数,30000)
打印('随机样本大小:',str(len(随机样本行数)))
对于范围内的i(尺寸):
印刷品(一)
如果我使用随机样本线编号:
b、 写入(所有_行[i])
其他:
a、 写入(所有_行[i])
打印(“随机完成!”)
编辑:

def shuffle_list(l, n):
    if n>=len(l):
        raise ValueError("Invalid randomized number. Out of list index boundary")
    shuffle(l)
    return l[:n]

需要几个小时才能将一个文件拆分为大约2000万行。文件的总大小为2.6G。

无需将整个输入文件读入内存。你真正需要的就是知道行数。让我们假设您已经知道了这一点,并将其称为
n
。(如果需要,可以在文件的单独过程中计算)。现在,当您阅读输入时,您可以选择写入哪个文件,其概率与您已经选择的随机行数有关

import random

with open('bigfile.txt', 'r') as f, \
    open('split1.txt', 'w') as a, \
    open('split2.txt', 'w') as b:

    # Compute number of lines, if necessary
    for size, _ in enumerate(f, start=1):
        pass

    f.seek(0)  # Start over

    for line in f:
        out = random.choices([a, b], [n, size - n])
        if out is a:
            n -= 1
        size -= 1
        out.write(line)
您可以证明,这使每一行被选择为文件
a
的概率相同。直观地说,每次你选择一条线,选择后面一条线的概率都会降低,因为可用的空闲“插槽”更少。同时,当您通读该文件时,可能性会增加,因为剩下的插槽中的填充选项越来越少。在极端情况下,当
n
达到0时,您将停止拾取行,并且始终拾取一行
n==size


如果您对
大小应该是多少有一个粗略的估计,那么您可能可以使用它而不是通过读取整个文件来计算其确切大小,而不会偏离真正的均匀分布。

您使用的python版本是什么?您是自己编写的
shuffle\u list
还是一个内置的?如果是你写的,你能描述一下它是做什么的,或者把代码贴在这里吗?文件有多大?总尺寸不是线的数量短回答:是的,这可能会加快很多。在b中精确记录30K是很重要的,还是近似数字也会起作用?如果将该变量设置为一个集合而不是一个列表,则随机样本行数中的
i
测试会快得多。然而,我不知道你的总时间中有多少是被那个测试占用的。两个问题:选择不是完全随机的(几率取决于行号),如果不严格执行精确计数,则可以避免两次通过。第一个问题:这在数学上相当于统一选择一个固定大小的行子集。较早的线路被选择的概率比较晚的线路小,但这是一个平衡点,因为较晚的线路被考虑的概率较小。我在回答的最后提到了第二个问题。是的。我可以在离线时知道总行号。这看起来也是一个解决更大文件的好办法@切普纳:我错了。我误读了情况,试图解决一个稍微不同的问题。