2012-01-11 18 views
23

Belirli bir boyuta sahip bir dosya oluşturmak istiyorum (demek, 1GiB). İçeriği doldurmam gerektiğinden içerik önemli değil.python belirli boyutta dosya oluştur

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

Ama bu bitirmek için çok uzun sürüyor:

Ne yapıyorum olduğunu. Bana yaklaşık 1 dakika harcıyor. Bunu geliştirmek için neler yapılabilir?

+0

1 dk kadar iyi gibi geliyor. BTW, bu dosyada tam olarak ne yapıyorsunuz? –

+4

1073741824 bytes! = 1GB. Mekanik HDD yerine bir SSD kullanın? Bir ağ paylaşımından ziyade yerel diske yazın? – Johnsyweb

+3

@Johnsyweb neden? 1024 * 1024 * 1024' değil mi? – onemach

cevap

32

UYARI Bu çözüm, beklemediğiniz bir sonuç verir. UPD ...

1 Yeni dosya oluştur.

2 beden-1 bayt aramayı deneyin.

3 Yazma 1 bayt.

4 kar :)

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

1073741824 

UPD: Seek and kesmek hem benim sistemde (Linux + ReiserFS) üzerinde seyrek dosyaları oluşturmak. Gerektiği kadar büyüklükleri var ama aslında depolama cihazında yer tüketmiyorlar. Yani bu hızlı alan tahsisi için uygun bir çözüm olamaz. Sadece 25Gib serbest ve sonuçta 25Gib ücretsiz sahip 100Gib dosyası oluşturduk.

+0

cool, iyi çalışıyor – onemach

+0

Sisteminiz destekliyorsa, 'truncate()' çözümü - kesinlikle görülebilir - daha iyi olabilir, çünkü bu çözüm gerekli olmasa da bu dosya için 1 ayırma bloğu tüketir. – glglgl

+2

Bu seyrek bir dosya oluşturmuyor mu? (Bu gerekli olabilir, ancak tam olarak aynı olmayabilir) – Arafangion

19

Soru daha önce answered olmuştur. Çözüm çapraz platform olup olmadığından emin değil, ancak Windows (NTFS dosya sistemi) sorunsuz çalışır.

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

This answerseek ve write kullanır: bana alır gibi

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

[Dokümanlar:] (http://docs.python.org/library/stdtypes.html # file-objects _note Belirtilen bir boyut dosyanın geçerli boyutunu aşarsa, sonucun platforma bağlı olduğunu unutmayın: olasılıklar dosyanın değişmeden kalmasını, belirtilen boyutta sıfır doluymuş gibi artmasını veya belirtilen değere yükseltilmesini içerir. undefined new content._ ile boyut –

+0

@JanneKarila Bu durumda 'file.to.create' boş bir dosyadır, bu nedenle belirtilen boyut her zaman dosyanın geçerli boyutunu aşacaktır? – qed

+0

@qed Evet öyle olacak. –

İlgili konular