У меня есть эта домашняя работа, где я должен передать очень большой файл из одного источника на несколько машин, используя своего рода алгоритм bittorrent. Сначала я разрезаю файлы на куски и передаю куски всем целевым объектам. Цели обладают интеллектом, позволяющим делиться имеющимися у них фрагментами с другими целями. Это работает нормально. Я хотел передать файл размером 4 ГБ, поэтому заархивировал четыре файла размером 1 ГБ. Когда я создал tar-файл размером 4 ГБ, он не выдал ошибку, но на другом конце, когда я собирал все фрагменты обратно в исходный файл, он выдает ошибку, говоря, что превышен предел размера файла. Как я могу решить эту проблему ограничения 2 ГБ?
Как создать файл размером более 2 ГБ в Linux/Unix?
Ответы (5)
Я могу предположить две возможные причины:
- В ядре Linux не включена поддержка больших файлов.
- Ваше приложение не скомпилировано с поддержкой больших файлов (вам может потребоваться передать дополнительные флаги gcc, чтобы указать ему использовать 64-разрядные версии определенных функций ввода-вывода файлов, например,
gcc -D_FILE_OFFSET_BITS=64
)
_FILE_OFFSET_BITS
передает O_LARGEFILE
системному вызову open
в правильной арке, но _FILE_OFFSET_BITS
предпочтительнее для переносимости: stackoverflow.com/questions/2888425/
- person Ciro Santilli 新疆再教育营六四事件ۍ 17.08.2017
Это зависит от типа файловой системы. При использовании ext3 у меня нет таких проблем с файлами значительно большего размера.
Если базовым диском является FAT, NTFS или CIFS (SMB), вы также должны убедиться, что используете последнюю версию соответствующего драйвера. Есть некоторые старые драйверы, которые имеют ограничения на размер файла, такие как те, с которыми вы сталкиваетесь.
Может ли это быть связано с системой конфигурация ограничения ?
$ ulimit -a
vi /etc/security/limits.conf
vivek hard fsize 1024000
Если вы не хотите никаких ограничений, удалите fsize
из /etc/security/limits.conf
.
Если ваша система поддерживает это, вы можете получить подсказки с помощью: man largefile
.
Вы должны использовать fseeko и ftello, см. fseeko(3) Обратите внимание, что вы должны определить #define _FILE_OFFSET_BITS 64
#define _FILE_OFFSET_BITS 64
#include <stdio.h>