繁体   English   中英

保存文件的最佳做法-python pickle用例

[英]Best Practices for Save Files - a python pickle use case

我不是一名程序员,他从事简单的python编程,以实现工作中与GIS相关的任务的自动化。 但是,我发现我真的很喜欢它,并且在工作之外“扩展”了我的技能。

我目前正在使用Pickle模块保存类实例,并意识到我有一些用于保存数据的结构选项。 我的问题是哪个选项是“更好”或更“可接受/最佳实践”的选项,或者是否有更好的选择。

我将使用“ playstation式”示例,仅用于踢球:

有多个用户。 每个用户都有一组特定游戏的奖杯。 每个用户可能还具有一个特定游戏的多个玩家配置文件,并且这些角色中的每个角色都可以具有多个保存的游戏玩法实例。

因此,当某人登录时,他们从保存的用户对象列表中选择自己是哪个用户(或创建一个新的对象-但现在我将忽略创建新方案)。 根据您以哪个用户身份登录,可以从保存文件以及与该用户关联的任何播放器配置文件中加载适当的Trophys对象。 当用户加载已保存的游戏时,他们会选择适当的玩家资料,并列出与该角色相关的已保存游戏信息。 用户将选择他们想要的保存,然后将加载游戏数据。

我看到的方式有几种选择:

1)根据类别分离保存文件。 例如:

A) "users" - this could contain a list of the User() objects
B) "<username>_trophies" - this could contain a list of the Trophy() objects assotiated with the user indicated in the filename
C) "<username>_characters" - this could contain a list of the Player() objects assotiated with the user indicated in the filename
D) "<username>_<charactername>_save<#>" - this could contain a save of the game info (probably as a dictionary with various info) assotiated with the username and charactername indicated in the filename

通过此设置,可以根据需要取消对每个文件进行剔除,因此,如果用户从未选择查看其奖杯,则永远不必加载奖杯信息。

但是,我想知道这是否将它分解得太多并创建了太多文件。 使用此选项会更好吗?:

2)拥有一个全面的保存文件,所有信息均以字典形式保存。 例如:

{User:[[Trophy,Trophy,Trophy], {Character: [(game info),
                                            (game info),
                                            (game info)];
                                Character:  [(game info),
                                            (game info),
                                            (game info)]}];
 User:[[Trophy,Trophy,Trophy], {Character: [(game info),
                                            (game info),
                                            (game info)];
                                Character:  [(game info),
                                             (game info),
                                             (game info)]}]}

那么,哪个更好? 可以吗? 都不是?

感谢您提供的所有帮助/意见!

关于保存各种信息的关键之一是一致性。 除非您有大量数据,否则文件系统的性能通常不是问题,因为文件系统缓存意味着您很少在磁盘本身上等待。

我认为在这种应用程序中拆分数据不会有任何好处,而且它们“不同步”的机会很高。 我强烈建议您将内容放在一个文件中。

至于“更好的选项”选项,我建议查看sqlite3模块( http://docs.python.org/2/library/sqlite3.html)-许多应用程序(来自时间跟踪器,请注意使用者等到网络浏览器)使用sqlite数据库来存储其配置,其中最重要的事情就是只有一个包含数据的文件,该文件可以轻松地移动,备份等(需要注意的是,使用时不应移动/备份!)

您可能还需要查看json模块,该模块与pickle模块具有类似的接口(加载/加载/转储/转储),但是它写入的文件在很大程度上是人类可读和可修改的。 缺点是只能存储基本类型(字符串,布尔值,数字)以及这些简单类型的列表和字典。

如果当时只有一个用户,那么您可以将所有内容放入一个文件中。 这将是最容易实现的选择。

当用户数量增长时,您会发现从多个进程更改单个文件将不起作用。 有两个进程读取文件,然后在内存中进行更改,然后写回磁盘。 仅保留最后保存的更改。 因此,您自然可以将数据拆分为不同的文件。

但是,对于每个用户实现,文件也会再次发生相同的问题。 然后,您应该研究其他类型的存储,例如数据库。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM