問題タブ [file-mapping]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - ファイルのサイズを事前に知らなくても、Windows プラットフォームでメモリ マップされたファイルの最後を見つける方法は?
Windows プラットフォームで不明なサイズ (約 4 ~ 6 GiB) のファイルをマップし、MapFileView 関数から返されたファイル データの先頭へのポインターを取得しました。しかし、ポインターを使用してデータに順次アクセスするときに、ファイルの終わりに到達したことをどのように知ることができますか?
これまでに書いたコードは次のとおりです。ファイルを正常にマップし、ポインターを返します。
そのため、ファイルの同じサイズの異なる部分を複数のスレッドで同時に読み取りたいと考えました。この目的には、マップされたファイルが正しい選択だと思います。他のより高速で可能なアプローチについてのアドバイスは大歓迎です。
私はフォーラムでいくつかの同様の質問を調査しましたが、これが私が見つけた最も近いトピックだと思います: Read all contents of memory maps file or Memory Mapped View Accessor without know the size of it しかし、この回答は C# を使用しており、次を使用して書かれていません。 WinAPI だったので、そのプロセスを理解できませんでした。
前もって感謝します :)
c++ - Linux と Windows での大きなファイルの読み取り (mmap と CreateFileMapping/MapViewOfFile)
大きなファイル (7 GB 以上) から 1 行ずつデータを読み取る必要があります。このファイルには、メッシュを形成するための頂点座標と面から頂点への接続情報のリストが含まれています。open
また、mmap
Linux では をCreateFileA
、 Windows ではを使用する方法も学んCreateFileMapping
でMapViewOfFile
います。Linux と Windows の両方のバージョンは 64 ビットでコンパイルされています。
Linux (docker を使用) を使用している場合g++-10 test.cpp -O3 -std=c++17
、約 6 秒かかります。私が Windows (実際の PC) を使用している場合 (バージョン 19.29.30037 x64)cl test.cpp /EHsc /O3 /std:c++17
では 13 秒、clang++-11
(Visual Studio Build Tools から) では 11 秒になります。
const char*
両方のシステム (同じ PC ですが、一方は Docker を使用しています)は、メモリ配列を表す とメモリuint64_t
サイズを表すサイズを生成することを除いて、まったく同じコードを使用します。
これは私がプラットフォームを切り替える方法です:
具体的には、char-s の配列でメモリを取得するためのコードは次のとおりです。
私はこの種の解析にまったく慣れていないので、Windows API でパラメーターを選択する際に何か間違ったことをしているのだろうか (mmap の動作を模倣するため)、それとも時間の違いがコンパイラ/システムの問題であり、受け入れ?
const char*
開いてメモリ サイズを取得し、メモリ マップを取得するための実際の時間は、LinuxとWindows の両方で無視できますsize_t
。
お読みいただきありがとうございます。何かヒントがあれば大歓迎です。不明な点があれば申し訳ありません。