为什么在macOS上一个Python工具架文件包含的数据非常少?

2024-09-25 00:31:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我只是跟随一本书中给出的一个例子来说明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

Tags: 模块文件字符串版本addressesplacetmpjan
1条回答
网友
1楼 · 发布于 2024-09-25 00:31:02

我可以确认这个行为是由gdbm1.14引入的,gdbm是shelve用来访问数据库文件的库。在

使用change 2e8a5e0,gdbm将尝试扩展文件大小以匹配next_block_sizenext_block_size4 * block_size计算, 这是底层文件系统obtained by ^{} returned by ^{}的最佳I/O块大小。在我的macOS 10.13.3上,SSD卷上APFS上的文件stat.st_blksize为4194304字节,next_block_size为16777216字节,因此init db文件大小为16MB。在

ps:我检查了我手上的一个HDD卷上的HFS+fs,st_blksize值是4096字节。在

相关问题 更多 >