いくつかの番号を持つ特定の数の固定長の行を含むファイルがあります。その行を読み込んで処理し、ファイルに書き込むためには、各行を読み込む必要があります。 各行を読み込む必要があるので、行数が増えると時間がかかります。ファイルを読む最も効率的な方法
ファイルの各行を効率的に読み取る方法はありますか?私はC#を使用しています。
いくつかの番号を持つ特定の数の固定長の行を含むファイルがあります。その行を読み込んで処理し、ファイルに書き込むためには、各行を読み込む必要があります。 各行を読み込む必要があるので、行数が増えると時間がかかります。ファイルを読む最も効率的な方法
ファイルの各行を効率的に読み取る方法はありますか?私はC#を使用しています。
ファイルからすべての行を読み取ることは、常に少なくともO(n)です。ファイルサイズが問題になり始めると、フラットファイルではなく情報用のデータベースを作成することを検討するのがいいでしょう。
ファイルは、ファイルの形式で、実際には多数のファイルになる外部ハードウェアの結果です。ファイルを効率的に読み取る方法はありません。 – Jay
File.ReadLines
(.NET 4.0+)はおそらくこれを行う最もメモリ効率的な方法です。
IEnumerable<string>
を返します。これは、行がストリーミング方式で遅延して読み込まれることを意味します。
以前のバージョンでは、この方法で利用できるストリーミングオプションはありませんでしたが、StreamReader
を使用して1行ずつ読むと同じ結果が得られます。
ない、これが最も効率的であるが、それは私のためにうまく機能してください: http://msdn.microsoft.com/en-us/library/system.io.fileinfo.aspx
//Declare a new file and give it the path to your file
FileInfo fi1 = new FileInfo(path);
//Open the file and read the text
using (StreamReader sr = fi1.OpenText())
{
string s = "";
// Loop through each line
while ((s = sr.ReadLine()) != null)
{
//Here is where you handle your row in the file
Console.WriteLine(s);
}
}
これは、コンソールに行を書き込むのではなく、行を配列に変換してデータをインポートするデータベーステーブルに追加します。タブ区切りファイルで非常に速く実行されているようですが、数千ものレコードをそれ以上で処理する必要はほとんどありません。 –
StreamReaderで特別なことをしていない限り、この例ではそうではありませんが、 'foreach(File.ReadLines(path)のvar行){Console.WriteLine(line); } '。 – Philip
あなたが使用しているオペレーティングシステムに関係なく、あなたのコードと実際のストレージの間にいくつかの層が存在することになります機構。ハードドライブとテープドライブにはファイルがブロック単位で格納されていますが、通常はそれぞれ4Kバイト程度です。 1バイトの読み込みを望むならば、デバイスはブロック全体をメモリに読み込みますが、それはちょうど高速です。デバイスおよびOSはそれぞれ、ブロックのキャッシュを保持することもできる。標準的な(高度に最適化された)ファイルの読み込み動作を変更することはあまりありません。必要に応じてファイルを読んで、残りの部分をシステムで処理させてください。
ファイルを処理するための時間が問題になっている場合は、役立つかもしれない2つのオプションがあります。
は短いファイルを使用するようにしてください。ログファイルなどを処理しているように思えます。プログラムを頻繁に実行すると、少なくともパフォーマンスの向上に役立ちます。
データの格納方法を変更します。繰り返しますが、私はファイルが外部ソースから来ていることを理解していますが、生のファイルを定期的に変換してより素早く読み込めるようにすることができます。
幸運。
StackOverflowに属します。 –
あなたは4.0または2/3.5にいますか? –