Мне нужно искать в больших файлах от 30 ГБ до 500 ГБ. К сожалению, мне нужно сделать это в 32-битной системе.
Я только что врезался в ограничение 2GB PHP с fseek()
В некотором смысле я не видел документально в Интернете.
$ php -r 'var_dump(fseek(fopen("/dev/sda", "r"), 0, SEEK_END));'
int(-1)
Итак, системный вызов возвращается -1
, Интересно, почему:
$ strace php -r 'var_dump(fseek(fopen("/dev/sda", "r"), 0, SEEK_END));'
...
lstat64("/dev/sda", {st_mode=S_IFBLK|0660, st_rdev=makedev(8, 0), ...}) = 0
lstat64("/dev", {st_mode=S_IFDIR|0755, st_size=5460, ...}) = 0
open("/dev/sda", O_RDONLY) = 3
fstat64(3, {st_mode=S_IFBLK|0660, st_rdev=makedev(8, 0), ...}) = 0
lseek(3, 0, SEEK_CUR) = 0
lseek(3, 0, SEEK_END) = -1 EOVERFLOW (Value too large for defined data type)
Это происходит с файлом размером всего 60 ГБ.
Так что я даже не могу стремиться к концу — lseek()
по-видимому, не в состоянии представить указатель файла обратно в PHP.
В отдельном примечании, многократный поиск вперед с SEEK_CUR, кажется, застрял в 4 ГБ — я не могу переместить указатель файла за эту точку. Мне нужно искать до конца 500ГБ файлов.
Каковы мои альтернативы? Мои текущие планы использовать dd
(это на Linux), и инструмент, который я пишу, может быть сценарием оболочки на этом этапе …
Задача ещё не решена.
Других решений пока нет …