3

の効率を確認しながら、文字列(番号はディレクトリ内のファイルの番号を示す数字にすぎません) でos.walkファイルを作成しました。たとえば、ディレクトリ内のファイルの内容は次のようになります。6,00,000Hello <number>

File Name | Contents
1.txt     | Hello 1
2.txt     | Hello 2
.
.
600000.txt|Hello 600000

今、私は次のコードを実行しました:-

a= os.walk(os.path.join(os.getcwd(),'too_many_same_type_files')) ## Here, I am just passing the actual path where those 6,00,000 txt files are present
print a.next()

私が感じた問題は、返される 3 番目の項目がディレクトリ内のファイルのリスト(600000 個の項目がある)a.next()であるため、時間とメモリがかかりすぎることでした。そのため、ファイル名のリストではなく、タプルの 3 番目の項目としてジェネレーター オブジェクトを返すようにすることで、 (少なくとも)スペースの複雑さを軽減する方法を見つけようとしています。a.next()a.next()

スペースの複雑さを軽減することは良い考えでしょうか?

4

3 に答える 3

1

人々がすでに述べたように、ディレクトリに 600,000 個のファイルがあるのは悪い考えです。最初は、ファイル リストにアクセスする方法から、これを行う方法は本当にないと思っていましたが、間違っていることがわかりました。次の手順を使用して、目的を達成できます。

  1. サブプロセス or を使用して orをos.system呼び出します(OS が何であれ)。そのコマンドの出力を一時ファイルに送信します (たとえば、何か。Python には、新しいファイルを返すことができるモジュールがあります)。lsdir/tmp/myfilestmp

  2. そのファイルを Python で読み取るために開きます。

  3. ファイル オブジェクトは反復可能であり、各行を返すため、ファイル名だけがあれば問題ありません。

于 2012-08-16T17:00:10.143 に答える
1

os.walk 内部で呼び出しlistdir()てルート ディレクトリの内容を取得し、返されたアイテムのリストをディレクトリと非ディレクトリに分割します。

目的を達成するには、さらに掘り下げて、独自のバージョンの だけでなく、 generator を返す代替walk()も実装する必要があります。それでも、変更されたものを2回個別に呼び出して結果をその場でフィルタリングしない限り、ディレクトリとファイルの両方に独立したジェネレーターを提供することはできないことに注意してください。listdir()listdir()

上記のコメントでSvenが示唆しているように、ソリューションを過剰に設計するよりも、実際の問題(ディレクトリ内のファイルが多すぎる)に対処する方がよい場合があります。

于 2012-08-16T17:00:59.707 に答える
1

基礎となる C API が動作する方法です。

readdirにアクセスできる場合は、それを実行できます。残念ながら、これは Python によって直接公開されていません。

この質問は 2 つのアプローチを示しています (両方とも欠点があります)。

よりクリーンなアプローチは、C でモジュールを記述して、必要な機能を公開することです。

于 2012-08-16T16:48:05.267 に答える