用Python拆分大文件的最佳方法

3
我需要将一个非常大(3GB)的文件分成十份,分割方式如下:第一次分割在前10%的行和文件的其余部分之间进行,第二次分割在第二个10%的行和文件的其余部分之间进行,以此类推(这是为了进行交叉验证)。
我曾经很幼稚地通过将文件的行加载到列表中,遍历该列表并按其索引将每行写入正确的输出文件中来完成此操作。由于每次写入3GB的数据,这太耗时了。
有更好的方法吗?
注意:在每行开头添加#相当于删除它。在开头添加和删除#是否更明智?
示例:如果文件是[1,2,3,4,5,6,7,8,9,10],那么我想按以下方式分割:
[1] and [2,3,4,5,6,7,8,9,10]
[2] and [1,3,4,5,6,7,8,9,10]
[3] and [1,2,4,5,6,7,8,9,10]

以及诸如此类的内容

嗯... 如果你在一个类UNIX系统上,最好在操作系统级别上执行分割操作... split命令可以按行工作,所以你将能够拥有大多数大小相等的文件(至少按行数计算)。 - Lix
你想把文件分成10个部分吗? - Padraic Cunningham
一些注意事项:无论采取什么方法,您仍然需要编写3GB的数据;没有办法在原地拆分文件。因此,虽然您可以通过使用本机操作系统工具加快用户空间方面的速度,但您将遇到由计算机执行I/O的速度定义的下限。 - roippi
@roippi: "#" 技巧不起作用吗? - Roy
2
最好的方法是创建一个操作系统级别的10个文件(每个文件10%),然后在操作系统级别方便地将它们连接起来。 - Jose Ricardo Bustos M.
显示剩余6条评论
1个回答

1
我建议尝试减少文件数量。虽然在现代硬盘中30 GB并不算太多,但仍需要大量的工作(和时间)来处理。
例如:
- 假设您想要10%的行而不是10%的大小,则可以创建一个索引文件,其中包含每行的开头,并通过索引访问(单个原始)文本文件。 - 您还可以将原始文件转换为固定记录文件,以便每个文本行占用相同的大小。然后,您可以使用seek()进行选择性访问。 - 这两个功能都可以通过在Python中定义类似文件的对象来“隐藏”。这样,您就可以将单个文件作为几个“虚拟”文件访问,每个文件只显示您想要的部分(或部分)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接