0

各行に UUID を持つ 2 つのファイルがあります。各ファイルには数十万行あります (データベース ダンプから生成されます)。これらのファイルを並べ替えて、相違点を見つける必要があります (追加/削除)。これは、いくつかの *nix ツールを使用して簡単に実行でき、数秒しかかかりません。

$ sort file-a.txt > file-a-sorted.txt
$ sort file-b.txt > file-b-sorted.txt
$ diff file-a-sorted.txt file-b-sorted.txt

ただし、この機能を、マルチプラットフォームでの使用を目的とした (Node 上に構築された) CLI に追加したいと考えています。したがって、サブプロセスを生成してこれらのツールに委任することはオプションではありません。

「愚か」で各ファイルをメモリにロードし、改行で分割し.sort()、結果の配列を呼び出すと、驚くほどうまく機能します(かなり多くのメモリを使用しますが、高速です...)が、違いを見つけるのはかなり難しいことが証明されています.

答えはストリームの領域のどこかにあると確信していますが、ストリームを操作した経験がないため、どこから始めればよいかわかりません。

Node.js を使用してこのような大きなファイルをロード、ソート、および比較する効率的な手法は何ですか?

私は完全な解決策を探しているわけではありません (ただし、お気軽に!)、この段階ではポインタだけが本当に役に立ちます。

ありがとう!

4

2 に答える 2

0

ソートされた配列としてメモリ内にファイルが既にあるため、difflibを確認してください。

これはあなたのユースケースにぴったり合っているようです:

>>> difflib.unifiedDiff('one two three four'.split(' '),
...                     'zero one tree four'.split(' '), {
...                       fromfile: 'Original'
...                       tofile: 'Current',
...                       fromfiledate: '2005-01-26 23:30:50',
...                       tofiledate: '2010-04-02 10:20:52',
...                       lineterm: ''
...                     })
[ '--- Original\t2005-01-26 23:30:50',
  '+++ Current\t2010-04-02 10:20:52',
  '@@ -1,4 +1,4 @@',
  '+zero',
  ' one',
  '-two',
  '-three',
  '+tree',
  ' four' ]
于 2016-11-23T22:05:44.863 に答える