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 p> 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? P> merci p> p>
3 Réponses :
options pour réduire la mémoire: p>
où code> clause, peut-être utiliser la pagination ou similaire li>
- n'utilise pas
datatable code> - il est pas votre ami em> 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 LI>
- Si vous essayez d'écrire dans un fichier, n'utilisez pas un
MemoryStream code>: écrire directement sur le filtream code> 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 () code> - même si vous utilisez MemoryStream code>, préférez getbuffer () CODE> et limite à . / code>; Ou utilisez StringWriter code> li>
ol>
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 p>
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 p>
ceci: p> donne p> 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. P> p>
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.
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.