#node.js #filesystems #system-calls
#node.js #файловые системы #системные вызовы
Вопрос:
Я предполагаю реализацию в node.js это позволяет манипулировать файлом на диске, как если бы это была структура данных стека.
Предположим, что файл представляет собой обычный текст в кодировке utf-8, каждый элемент стека соответствует 'n'
строке с разделителями в файле, а вершина стека указывает на первую строку этого файла. Я хочу что-то, что может одновременно читать и записывать файл.
const file = new FileAsStack("/path/to/file");
// read the first line from the file,
// also remove that line from the file.
let line = await file.pop();
Чтобы наивно реализовать такой интерфейс, я мог бы просто прочитать весь файл в память, а при .pop()
чтении из памяти записать остаток обратно на диск. Очевидно, что такой подход не идеален. Представьте, что вы имеете дело с файлом объемом 10 ГБ, он будет потреблять много памяти и ввода-вывода.
С fs.read()
я могу прочитать только фрагмент файла, поэтому часть «чтения» решена. Но о части «запись» я понятия не имею. Как я могу эффективно использовать только одну строку и записать в нее остальную часть файла? Я надеюсь, что мне не придется считывать каждый байт этого файла в память, а затем записывать обратно на диск…
Я смутно помню, что файл в файловой системе — это просто указатель на позицию на диске, могу ли я каким-либо образом просто переместить указатель в начало следующей строки?
Мне нужно некоторое представление о том, какие системные вызовы или что-то еще может сделать это эффективно, но я совершенно не разбираюсь в системных материалах низкого уровня. Любая помощь приветствуется!
Комментарии:
1. То, о чем вы просите, не то, что может сделать стандартная файловая система. Для меня это больше похоже на то, что вы хотите использовать базу данных, которая может хранить данные любым эффективным способом, но затем возвращать их вам в определенном порядке, указанном запросами и индексами. Таким образом, вы можете добавлять данные в начало запроса без перезаписи всего файла данных.
2. О … грустно это слышать. Спасибо за совет, но мне действительно нужно иметь дело с родной fs в этом конкретном квесте.
3. Ну, вы не можете вставить данные в начало файла в любой традиционной файловой системе ОС без перезаписи всего файла. Именно так они и работают. Вы могли бы создать свою собственную файловую систему поверх файловой системы ОС, где вы разбиваете данные на несколько файлов, а затем имеете некоторый файл главного индекса, который сообщает вам, в каком порядке должны находиться различные фрагменты данных (своего рода виртуальный файл). Таким образом, вы могли бы вставлять данные в начале, не переписывая какие-либо данные, кроме основного индекса. Но это может усложниться очень, очень быстро.
4. Возможно, если вы расскажете нам больше о реальной проблеме, которую необходимо решить здесь, и требованиях к ней (а не о вашей попытке ее решения), мы могли бы дать лучшие рекомендации о том, какую технологию лучше всего использовать для решения проблемы такого типа.
5. @jfriend00 Я спрашиваю об этом больше из любопытства, чем по практическим соображениям. Просто идея возникла, когда я предварительно обрабатываю какой-то огромный набор данных и хочу отметить обработанные части. Если это невозможно, я мог бы просто сохранить смещение в файл без записи в него.
Ответ №1:
То, о чем вы просите, не то, что может сделать стандартная файловая система. Вы не можете вставить данные в начало файла в любой традиционной файловой системе ОС без перезаписи всего файла. Именно так они и работают.
Системы, которым абсолютно необходимо иметь возможность делать что-то подобное без перезаписи всего файла и которые все еще используют традиционную файловую систему ОС, создадут свою собственную мини-файловую систему поверх обычной файловой системы, так что один виртуальный файл будет состоять из множества частей, записанных в отдельные файлы или в отдельные блоки файла. Затем в подобной системе вы можете вставить данные в начало виртуального файла без перезаписи каких-либо существующих данных, записав новый блок данных на диск, а затем обновив индекс вашего виртуального файла (хранящийся в каком-либо другом файле), чтобы указать, что первый блок вашего виртуального файла теперь поступает из определенного местоположения. Этот индекс файла определяет порядок расположения блоков данных в файле и откуда они берутся.
Большинство программ, которым необходимо сделать что-то подобное, вместо этого будут использовать базу данных для хранения записей, а затем использовать индексы и запросы для управления порядком и позволить базовой базе данных беспокоиться о том, где отдельные биты хранятся на диске. Таким образом, вы можете очень эффективно вставлять данные в любое место, которое вы хотите, в результирующий запрос.