【问题标题】:Getting around OSError 'File too large' with 4GB writing limit in Python?在 Python 中使用 4GB 写入限制绕过 OSError“文件太大”?
【发布时间】:2021-09-19 04:45:52
【问题描述】:

我正在使用分块(在 iPython 和 Mac OS 中使用 Python 3.7.6)将大约 200 个 csv 文件(大多数 10 到 200 MB)合并到闪存驱动器上的单个文件中。

合并后的文件大小为 4.29 GB。当我尝试在其上写入另一个文件(大小约为 150 MB)时,我得到OSError: [Errno 27] File too large。代码如下:

import pandas as pd
import os

paths_to_combine = ['file1.csv', ..., 'file200.csv']   # contains 200 files
output_path = 'all.csv'

for file in all_result_filenames:
    chunk_container = pd.read_csv(file, chunksize=50000)
    for chunk in chunk_container:
        chunk.to_csv(output_path, mode="a", header=False)

通过阅读类似的问题(herehere),似乎在写入 4 GB 以上的文件时可能存在寻址问题。由于问题出在操作系统上,因此我不知道接下来要尝试什么。感谢您的帮助!

【问题讨论】:

  • 您正在写入的驱动器的格式是什么?是FAT32吗? Mac 的默认 HFS+ 或 APFS 支持远大于 4 GB 的文件。
  • 啊,好点。是的,它是 MS-DOS (FAT32)——我正在写入闪存驱动器。
  • 哦,您正在尝试在闪存驱动器上写入(“闪存驱动器上的单个文件”)。您需要使用磁盘工具将该闪存驱动器重新格式化为 exFAT 而不是 FAT32。问题与操作系统无关,与驱动器格式有关。
  • 请注意,重新格式化将破坏驱动器上当前的所有数据。您需要将其上的任何内容复制到其他地方,然后在重新格式化后将其复制回来。 exFAT 适用于大多数操作系统:macOS 和 Windows。它也适用于 Linux 机器,具体取决于口味。
  • 非常感谢,这很简单!我会尝试重新格式化驱动器。

标签: python python-3.x pandas file-io operating-system


【解决方案1】:

您的问题与 macOS 无关。它与您要写入的驱动器的格式有关。 macOS 对文件大小没有限制,但它确实有两个默认文件系统:HFS+ 和 APFS。它们都支持艾字节级别的文件大小。一段时间内我们无需担心文件大小。

您的问题暗示您要写入闪存驱动器。 (编辑。根据澄清,您正在写入闪存驱动器。)问题几乎可以肯定是闪存驱动器被格式化为 FAT32,由于格式的 32 位性质,其最大文件大小约为 4 GB。

如果您要将数据复制到另一台本身不是 FAT32 的计算机上(例如,复制到具有 NTFS 的 Windows 或具有 HFS+ 或 APFS 的另一台 Mac),那么您应该重新格式化驱动器。如果另一台计算机是 FAT32,那么你就不走运了(现在你应该升级了)。

重新格式化您的闪存驱动器:

  1. 将您不想丢失的任何内容复制到另一个驱动器(或您的本地计算机)。 重新格式化会擦除驱动器:如果您不想丢失某些东西,请不要将其保留在要擦除的驱动器上。

  2. 在您的 Mac 上,打开 磁盘工具。在左侧大小中,在“外部”选项卡下,选择插入后的闪存驱动器,然后在右上角单击擦除

  3. 为您的驱动器输入一个新名称。在“格式”下,我建议选择“ExFAT”。如果您选择“APFS”或“Mac OS Extended”,Windows 计算机将无法读取您的驱动器(没有变通方法)。不要选择“Windows NT 文件系统”,您将无法在 Mac 上对其进行写入。我也会保留默认的 GUID 分区映射方案。

  4. 完成重新格式化后,更新您的df.to_csv(path) 路径,它应该在没有OSError 的情况下写得很好。当然,写作可能需要一些时间。在最后传递 path.gz.xz 可能是一种策略,以使用压缩并节省 IO 时间(以 CPU 时间为代价)。

请注意,如果您想在较旧的(至少是软件端)Linux 机器上读取 exFAT,您会收到一个错误,您需要install exFAT 实用程序。但较新的 Linux 内核应该嵌入 exFAT 支持。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-06
    相关资源
    最近更新 更多