0
votes

Réduisez l'empreinte de la mémoire si possible à l'aide de Ado.net Adapter

J'ai la nécessité de synchroniser une base de données mobile avec la base de données principale. L'idée est la suivante. J'ai un service de repos qui accepte d'entrer le nom du tableau que j'ai besoin de synchroniser (avec une date d'heure, puisque la prochaine fois que les données échangées ne seront que le delta de la dernière synchronisation à la date à laquelle je passe).

Dans la mise en œuvre actuelle (puisque je veux être aussi générique que possible) est la suivante xxx

maintenant pour une table sur le disque d'environ 256 Mo, j'ai eu une empreinte mémoire de mémoire 1 Go. Toute suggestion sur la manière de réduire l'empreinte mémoire?

merci


2 commentaires

Votre DB est-elle entière autour de 1 Go? Si tel est le cas, le nombre a du sens puisque votre moteur DB tentera de conserver autant de données que possible en mémoire. Si vous ne voulez pas que vous puissiez vous limiter, vous pouvez limiter la quantité de RAM Votre moteur DB peut utiliser dans les paramètres de votre DB. (varie selon un moteur différent)


On dirait que cela devrait être résolu via une approche DB distribuée pour commencer. Il semble que vous ayez mis en œuvre une réplication de manière difficile. En ce qui concerne l'empreinte mémoire, il est totalement normal que de tels adaptateurs ont besoin de beaucoup de RAM. En fait, deux fois plus que les données qu'il redeviennent, lorsqu'elles vérifient les données, puis la traduisent vers un format spécifique à Langauge, comme un jeu de données. Bien sûr, la chaîne interne peut aider une tonne si vous avez eu beaucoup de données texte.


3 Réponses :


0
votes

options pour réduire la mémoire:

  1. Ne chargez pas toute la table; Ajouter un clause, peut-être utiliser la pagination ou similaire
  2. n'utilise pas datatable - il est pas votre ami pour l'efficacité; Si vous avez juste besoin des données, envisagez des types de POCO, peut-être avec n'importe quel ormes de votre choix
  3. Si vous essayez d'écrire dans un fichier, n'utilisez pas un MemoryStream : écrire directement sur le filtream de sorte que vous n'avez pas besoin d'une copie supplémentaire de tout ; Il n'y a pas non plus besoin de ce toarray () - même si vous utilisez MemoryStream , préférez getbuffer () et limite à . / code>; Ou utilisez StringWriter

0 commentaires

0
votes

Je vous explique .. car je dois charger (et à la première fois, j'ai besoin de charger complètement environ 30 tables), j'ai besoin d'avoir l'ensemble du jeu de données. Je sais que Poco est préférable, mais je devrais créer 30 pocos et devoir faire manuellement l'insertion du côté client. De cette façon, je charge le jeu de données et faire un bulkinsert


0 commentaires

0
votes

Si vous regardez Le Docu , vous verrez la sortie d'un exemple très simple de jeu. XML ne consiste à créer une énorme générale basée sur l'ouverture et la fermeture des étiquettes XML.

du lien

ceci: xxx

donne xxx

ce que je veux Pour dire, c'est que pour ce petit exemple, une source de source de 17 caractères et 4 entiers entraîne 156 caractères. Cela devrait expliquer pourquoi une empreinte mémoire de 1 Go pour une base de données de 256 Mo devrait être attendue.


2 commentaires

Je le sais, mais je ne veux pas effectuer le mappage 1-1 pour chaque entité que j'ai


Réponse mise à jour pour l'expliquer plus loin.