1

何度か編集したため、この質問は少し矛盾している可能性があります。謝罪します。

私は現在Pythonサーバーを書いています。アクティブ ユーザーが 4 人を超えることは決してありませんが、私はコンピューター サイエンスの学生なので、とにかく計画を立てています。

現在、関連するすべての変数の現在の状態のバックアップを CSV ファイルに保存する機能を実装しようとしています。私は現在 10 人を持っていますが、決して大きくはなりませんが、コンピューター サイエンスの学生などです。

ということで、現在以下の2点を考えています。

  1. いつバックアップを実行しますか?
  2. どのようなバックアップですか?

いつ実行するか:

変数が変更されるたびにバックアップを実行できます。これには、常に現在の状態がバックアップに保持されるという利点があります。または、1 分間に 1 回などのように、サーバーが 1 分間に何百回もファイルを書き換えないという利点があります。忙しくなりますが、最後のバックアップ以降に変更された変数の検出を実装しないと、同じデータの無用な書き換えが多数作成されます。

それに直接関係するのは、どのようなバックアップを行うべきかという問題です。

すべての変数の完全バックアップ (変数が変更されるたびにバックアップを実行している場合は無意味ですが、X 分ごとにバックアップを実行している場合は良いかもしれません)、または単一の完全バックアップを実行できます。変数 (変数が変更されるたびにバックアップする方が良いですが、複数のバックアップ機能または現在バックアップされている変数のスマートな検出のいずれかが必要です)、または何らかのデルタバックアップを試すことができますファイル(おそらく現在のファイルを読み取って変更を加えて書き換える必要があるため、私が知らないPythonでこれに関するトリックがない限り、おそらくかなりばかげています)。

異なるプログラミング言語間でデータを移植できるようにしたいので使用できませんshelves(たとえば、java はおそらく python シェルフを開くことができません)。また、さまざまな理由で MySQL を使用できません。主に、サーバーを実行するマシンが MySQL をサポートしていないためです。インターネット接続が切断されたときにサーバーを実行し続けたいので、外部のMySQLサーバーを使用したくありません。

また、Python やその他のソフトウェア (sqliteたとえば、) の事前実装された関数を使用してこれを行う方法がいくつかあることも認識しています。私は、車輪を再発明するのが好きだからではなく、自分が使っているものがどのように機能するかを知りたいからです。私はこのサーバーを部分的に Python を学習するためだけに構築しています。SQLite の使用方法を知っていると便利ですが、自分で「汚い仕事」をすることも楽しんでいます。

1 日におそらく数回のリクエストを使用するという私の使用シナリオでは、「変更時のバックアップ」のアイデアに傾倒していますが、何らかの理由でサーバーが非常にビジー状態になると、それはすぐに崩れてしまいます

したがって、私の質問は基本的に次のようになります。このシナリオで最も役立つバックアップ方法はどれですか。別のバックアップ戦略を見逃している可能性がありますか? アプリケーションで使用する戦略をどのように決定しますか?

この質問は、主にバックアップ戦略とその背後にある考えに対する一般的な好奇心から提起したものであり、この特別なケースの問題のためではないことに注意してください.

4

2 に答える 2

2

sqliteを使用します。csv ファイルを使用して永続ストレージを構築することと、状況が変化したときにファイルを更新する方法について質問しています。あなたが求めているのは、軽量でポータブルなリレーショナル (テーブル ベースのような) データベースです。Sqlite は、この状況に最適です。

Python は、バージョン 2.5 からsqlite3モジュールを使用して、標準ライブラリで sqlite をサポートしています。sqlite データベースは単一のファイルとして実装されるため、複数のマシン間で簡単に移動できます。また、Java にはsqlite と対話するためのさまざまな方法があります。

私は学習のために物事を行うことに賛成ですが、データの永続性について本当に学びたいのであれば、「csv データベース」のアイデアと結婚するつもりはありません。Persistenceのウィキペディアのページを見ることから始めます。あなたが考えているのは、基本的にデータの「システム イメージ」です。ウィキペディアの記事では、あなたが言及したこのアプローチの同じ欠点のいくつかについて説明しています。

最後のイメージが保存された後にシステムに加えられた状態の変更は、システム障害またはシャットダウンの場合に失われます。ほとんどのシステムでは、変更ごとにイメージを保存するのは時間がかかりすぎます。

変更のたびに状態を大規模に更新しようとするよりも、他の形式の永続性を検討する方がよいと思います。たとえば、ある種のジャーナルがうまく機能する可能性があります。これにより、変更をログ ファイルの末尾または同様の構造に追加することが簡単になります。

ただし、プロセスが複数のスレッドで実行されている多数の同時ユーザーが発生する場合は、変更がアトミックであるかどうか、またはそれらが互いに競合するかどうかという懸念に直面します。オペレーティング システムには通常、編集のためにファイルをロックするいくつかの方法がありますが、それがどのように機能し、システムと対話するかを学習しようとするワームの缶を開いています。この時点で、データベースが必要になります。

もちろん、いくつかの異なるアプローチを試してみてください。しかし、明確かつ一貫した方法で動作させることを検討している場合は、sqlite を使用してください。

于 2012-02-28T21:20:14.720 に答える
1

データがCSVファイルにある場合は、それらのファイルにリビジョン管理システムを使用してみませんか?たとえば、 gitはかなり高速で、優れた履歴を提供します。リポジトリはファイルが存在するディレクトリに完全に含まれているため、処理は非常に簡単です。そのリポジトリを他のマシンやディレクトリに簡単に複製することもできます。

于 2012-02-28T20:49:41.853 に答える