我只是跟随一本书中给出的一个例子来说明macoshighsierra上的Pythonshelve
模块。在
如下图所示,一个架子中只存储了两个短字符串的小元组。正如您在最后一行中看到的,结果文件的大小是16MB。在
当我在macoshighsierra上使用通过Homebrew安装的Python版本(3.6.4或2.7.14)在macoshighsierra上尝试这个示例时,得到的文件才变得那么大。如果我在Linux主机上运行它,或者使用预安装的Python版本(2.7.10)或通过macOS中的官方安装程序安装的python3.6.4运行它,结果的addresses
文件只有几千字节大,正如其他人在评论中所报告的那样(谢谢!)。在
~/tmp> rm addresses
~/tmp> python3
Python 3.6.4 (default, Jan 6 2018, 18:43:09)
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.39.2)] on darwin
[...]
>>> import shelve
>>> book = shelve.open("addresses")
>>> book['flintstone'] = ('fred', '555-1234', '1233 Bedrock Place')
>>> book['rubble'] = ('barney', '555-4321', '1235 Bedrock Place')
>>> book.close()
>>>
~/tmp> ll
total 32768
-rw-r--r-- 1 moritz staff 16M Jan 24 13:05 addresses
我可以确认这个行为是由gdbm1.14引入的,gdbm是
shelve
用来访问数据库文件的库。在使用change 2e8a5e0,gdbm将尝试扩展文件大小以匹配} returned by ^{} 的最佳I/O块大小。在我的macOS 10.13.3上,SSD卷上APFS上的文件
next_block_size
。next_block_size
由4 * block_size
计算, 这是底层文件系统obtained by ^{stat.st_blksize
为4194304字节,next_block_size
为16777216字节,因此init db文件大小为16MB。在ps:我检查了我手上的一个HDD卷上的HFS+fs,
st_blksize
值是4096字节。在相关问题 更多 >
编程相关推荐