2012-01-11 14 views
23

特定のサイズ(たとえば1GiB)のファイルを作成したいと考えています。 内容は重要ではありません。特定のサイズのファイルをPythonで作成する

f = open("E:\\sample", "wb") 
size = 1073741824 # bytes in 1 GiB 
f.write("\0" * size) 

しかし、これは仕上げに時間がかかりすぎる:私は何をやっている

です。それは私に約1分を費やします。 これを改善するために何ができますか?

+0

1分は、それが私になると同じくらいいいですね。ところで、あなたはこのファイルで何をしていますか? –

+4

1073741824バイト!= 1GB。機械式HDDではなくSSDを使用しますか?ネットワーク共有ではなくローカルディスクに書き込みますか? – Johnsyweb

+3

@Johnsywebなぜですか?それは '1024 * 1024 * 1024'ですか? – onemach

答えて

32

警告このソリューションは、期待していない結果をもたらします。 UPDを参照してください...

1新しいファイルを作成します。

2サイズ-1バイトにシークします。

3書き込み1バイト。

4利益:)

f = open('newfile',"wb") 
f.seek(1073741824-1) 
f.write("\0") 
f.close() 
import os 
os.stat("newfile").st_size 

1073741824 

UPD: はシークと切り捨てるの両方私のシステム(Linuxの+ ReiserFSの)上のスパースファイルを作成します。彼らは必要に応じてサイズがありますが、実際にはストレージデバイスのスペースを消費しません。だから、これは高速なスペース割り当てのための適切な解決策ではありません。私はちょうど25Gibフリーを持っている100Gibファイルを作成しましたが、まだ25Gibを無料で持っています。

+0

cool、works fine – onemach

+0

もしあなたのシステムがそれをサポートしていれば、このソリューションは必要ないかもしれないが、ここではこのファイルに対して1つのアロケーションブロックを消費するので、 'truncate()'ソリューションはより良くなるかもしれません。 – glglgl

+2

それはスパースファイルを生成しませんか? – Arafangion

19

質問は前にansweredでした。ソリューションがクロスプラットフォームであるかどうかは不明ですが、Windows(NTFSファイルシステム)では完全に機能します。

with open("file.to.create", "wb") as out: 
    out.truncate(1024 * 1024 * 1024) 

This answerseekwriteを使用しています:

with open("file.to.create", "wb") as out: 
    out.seek((1024 * 1024 * 1024) - 1) 
    out.write('\0') 
+7

[Docs:](http://docs.python.org/library/stdtypes。html#file-objects)_指定されたサイズがファイルの現在のサイズを超えた場合、結果はプラットフォームに依存します:ファイルが変更されないままであるか、ゼロで埋められるかのように指定されたサイズに増加するか、サイズが定義されていない新しいコンテンツ._ –

+0

@JanneKarilaこの場合、 'file.to.create'は空のファイルなので、指定されたサイズは常にファイルの現在のサイズを超えますか? – qed

+0

@qedはいそうです。 –

関連する問題