Каков оптимальный способ объединения нескольких строк или нескольких слов в большом файле с помощью NodeJS? - PullRequest
0 голосов
/ 03 ноября 2019

Я был бы признателен всем, кто может предложить лучшее или лучшее решение для редактирования больших файлов в любом случае, от 1 МБ до 200 МБ с использованием nodejs.

Наш процесс должен объединить строки в существующий файл в файловой системе,Мы получаем измененные данные в следующем формате, который необходимо объединить с файлом файловой системы в позиции, определенной в измененных деталях.

[{"range":{"startLineNumber":3,"startColumn":3,"endLineNumber":3,"endColumn":3},"rangeLength":0,"text":"\n","rangeOffset":4,"forceMoveMarkers":false},{"range":{"startLineNumber":4,"startColumn":1,"endLineNumber":4,"endColumn":1},"rangeLength":0,"text":"\n","rangeOffset":5,"forceMoveMarkers":false},{"range":{"startLineNumber":5,"startColumn":1,"endLineNumber":5,"endColumn":1},"rangeLength":0,"text":"\n","rangeOffset":6,"forceMoveMarkers":false},{"range":{"startLineNumber":6,"startColumn":1,"endLineNumber":6,"endColumn":1},"rangeLength":0,"text":"f","rangeOffset":7,"forceMoveMarkers":false},{"range":{"startLineNumber":6,"startColumn":2,"endLineNumber":6,"endColumn":2},"rangeLength":0,"text":"a","rangeOffset":8,"forceMoveMarkers":false},{"range":{"startLineNumber":6,"startColumn":3,"endLineNumber":6,"endColumn":3},"rangeLength":0,"text":"s","rangeOffset":9,"forceMoveMarkers":false},{"range":{"startLineNumber":6,"startColumn":4,"endLineNumber":6,"endColumn":4},"rangeLength":0,"text":"d","rangeOffset":10,"forceMoveMarkers":false},{"range":{"startLineNumber":6,"startColumn":5,"endLineNumber":6,"endColumn":5},"rangeLength":0,"text":"f","rangeOffset":11,"forceMoveMarkers":false},{"range":{"startLineNumber":6,"startColumn":6,"endLineNumber":6,"endColumn":6},"rangeLength":0,"text":"a","rangeOffset":12,"forceMoveMarkers":false},{"range":{"startLineNumber":6,"startColumn":7,"endLineNumber":6,"endColumn":7},"rangeLength":0,"text":"s","rangeOffset":13,"forceMoveMarkers":false},{"range":{"startLineNumber":6,"startColumn":8,"endLineNumber":6,"endColumn":8},"rangeLength":0,"text":"f","rangeOffset":14,"forceMoveMarkers":false},{"range":{"startLineNumber":6,"startColumn":9,"endLineNumber":6,"endColumn":9},"rangeLength":0,"text":"s","rangeOffset":15,"forceMoveMarkers":false},{"range":{"startLineNumber":6,"startColumn":10,"endLineNumber":6,"endColumn":10},"rangeLength":0,"text":"a","rangeOffset":16,"forceMoveMarkers":false},{"range":{"startLineNumber":6,"startColumn":11,"endLineNumber":6,"endColumn":11},"rangeLength":0,"text":"f","rangeOffset":17,"forceMoveMarkers":false},{"range":{"startLineNumber":6,"startColumn":12,"endLineNumber":6,"endColumn":12},"rangeLength":0,"text":"s","rangeOffset":18,"forceMoveMarkers":false}]

Если мы просто откроем полный файл и объединим эти детали, это сработает, но оно сломается, если мы получим слишком много этих измененных деталей очень часто, которые могут вызвать проблемы из-за нехватки памяти, так как файл открывается много раз. раз, что также является очень неэффективным способом.

Существует аналогичный вопрос, нацеленный конкретно на c # здесь . Если мы откроем файл в потоковом режиме, есть ли подобный пример в nodejs?

Ответы [ 2 ]

0 голосов
/ 04 ноября 2019

Буду признателен всем, кто может предложить лучшее или лучшее решение для редактирования больших файлов в любом случае, в диапазоне от 1 МБ до 200 МБ с использованием nodejs.

Наш процесс должен объединить строки в существующий файл вВ файловой системе мы получаем измененные данные в следующем формате, который необходимо объединить с файлом файловой системы в позиции, определенной в измененных деталях.

Общие файловые системы ОС напрямую не поддерживают концепцию вставкиинформация в файл. Итак, если у вас есть плоский файл, и вы хотите вставить в него данные, начиная с определенного номера строки, вам необходимо выполнить следующие шаги:

  1. Открыть файл и начать чтение с самого начала.
  2. Когда вы читаете данные из файла, считайте строки до тех пор, пока не достигнете желаемого белья.
  3. Затем, если вы вставляете новые данные, вам нужно прочитать еще немного и поместить в буферобъем данных, которые вы намереваетесь вставить.
  4. Затем выполните запись в файл в месте вставки данных для вставки.
  5. Теперь, используя другой буфер, размер данных, который вы вставили,по очереди читая другой буфер, затем записывая предыдущий буфер.
  6. Продолжайте, пока не будет достигнут конец файла и все данные будут записаны обратно в файл (после вновь вставленных данных).
  7. Это дает эффект перезаписи всех данных после точки вставки обратно в файл, так что теперь он будет правильно в своем новом месте в файле.

По мере того, как выскажем, это неэффективно для больших файлов, так как вы должны прочитать весь файл в буфер за раз, и вы должны записать вставку и все после точки вставки.

В node.js,Вы можете использовать функции в модуле fs для выполнения всех этих шагов, но вы должны написать логику, чтобы соединить их все вместе, так как нет встроенной функции для вставки новых данных в файл, а после добавления существующих данныхit.

Здесь есть похожий вопрос, специально предназначенный для c #. Если мы откроем файл в потоковом режиме, есть ли подобный пример в nodejs?

Пример C #, на который вы ссылаетесь, просто добавляет новые данные в конец файла. Это тривиально сделать практически в любой библиотеке файловой системы. В node.js вы можете сделать это с помощью fs.appendFile() или открыть любой дескриптор файла в режиме добавления, а затем записать в него.


Для более эффективной вставки данных в файл вам потребуетсяиспользовать более эффективную систему хранения, чем один плоский файл для всех данных. Например, если вы сохранили файл по частям примерно в 100 линейных блоках, то для вставки данных вам нужно будет переписать только часть одного блока данных, а затем, возможно, выполнить какой-то процесс очистки, который перебалансирует границы блоков, если блок получаетслишком большой или слишком маленький.

Для эффективного управления линиями вам необходимо поддерживать точный индекс количества строк, содержащихся в каждом фрагменте файла, и, очевидно, в каком порядке должны быть фрагменты. Это позволит вам вставлять данные по несколько фиксированной цене. Независимо от того, насколько большим был весь файл, вам нужно было переписать один или два блока данных, даже если весь контент имел размеры в сотни ГБ.

Обратите внимание, что по сути вы будете создаватьновая файловая система поверх файловой системы ОС, позволяющая более эффективно вставлять или удалять общие данные. Очевидно, что фрагменты данных также могут храниться в базе данных и управляться там.


Обратите внимание, что если этот проект действительно является редактором, редактирование текстовой структуры на основе строк является очень хорошо изученной проблемой, и вы можете также изучить архитектуры, использовавшиеся в предыдущих проектах, для дальнейших идей. Это немного выходит за рамки типичного ответа здесь, чтобы изучить плюсы и минусы различных архитектур. Если ваша система также является редактором клиент / сервер, где инструкции по изменению отправляются от клиента к серверу, это также влияет на некоторые из желаемых компромиссов в дизайне, так как вы можете желать различных компромиссов с точки зрения количества транзакций илиобъем данных, передаваемых между клиентом и сервером.

Если какой-либо другой язык использует оптимальный путь, то я думаю, что было бы лучше найти этот вариант, поскольку вы говорите, что nodejs может не иметь этого параметра.

Это не имеет никакого отношения к выбранному вами языку. Это о том, как современные и типичные операционные системы хранят данные в файлах.

0 голосов
/ 03 ноября 2019

В модуле fs есть функция с именем appendFile. Это позволит вам добавить данные в ваш файл. Ссылка .

...