Bonjour,
J'ai un problème avec un petit script et la mémoire. J'ai environ 4000 images (2000 de 20ko max et 2000 de 500 à 700ko) à mettre sur un serveur Mysql. A chaque fois que je le lance ça me rend une erreur comme quoi il manque de mémoire.
Je comprends pas bien pourquoi la mémoire ne se décharge pas...
Je met les 2 script si jamais quelqu'un à une idée :
Première classe qui parcours le dossier source. Pour ce qui est de la méthode ChangeFileName.getNumberFromScreenshot() elle donne juste un int et fonctionne parfaitement.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| package insertImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.management.ManagementFactory;
import java.lang.management.MemoryMXBean;
import java.sql.ResultSet;
import java.sql.SQLException;
import changeFileName.ChangeFileName;
public class InsertImage {
static Mysql mysql = null;
public static void main(String[] args) throws SQLException, IOException {
mysql = new Mysql();
mysql.connectToMySQL("192.168.1.23", 3306, "root", "toor");
mysql.executeQuery("USE dolModel");
File dirSourceResized = new File("/home/charles/Images/resized");
File dirSourceNormal = new File("/home/charles/Images/final");
int i = 0;
MemoryMXBean memoryBean = ManagementFactory.getMemoryMXBean();
if (dirSourceResized.exists()) {
for (int j=0;j<3000;j++) {
newImage(j);
}
for (File screenShotNormal : dirSourceNormal.listFiles()) {
if (screenShotNormal.getName().contains("sshot")) {
i++;
insertNewImage(ChangeFileName.getNumberFromScreenshot(screenShotNormal), new File(dirSourceResized+File.separator+screenShotNormal.getName()) , screenShotNormal);
}
}
}
}
private static void newImage(int j) throws SQLException {
Mysql.newImage(j);
}
private static void insertNewImage(int numberScreen, File screenShotResized, File screenShot) throws SQLException, IOException {
Mysql.insertImage(numberScreen,screenShotResized, screenShot);
}
} |
Je ne met que la méthode qui est utile en ce qui concerne la 2eme classe.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| public static void insertImage(int id, File screenShotResized,File screenShot) throws SQLException, IOException {
BufferedInputStream screen = new BufferedInputStream(new FileInputStream(screenShot));
byte[] bytes = new byte[screen.available()];
BufferedInputStream screenResized = new BufferedInputStream(new FileInputStream(screenShotResized));
byte[] bytesMini = new byte[screenResized.available()];
screen.read(bytes);
screenResized.read(bytesMini);
stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
rsImage = stmt.executeQuery("select * from T_MODEL where idModel="+id);
rsImage.first();
rsImage.updateBytes("imageNormalModel", bytes);
rsImage.updateBytes("imageResizedModel", bytesMini);
rsImage.updateRow();
screen.close();
screenResized.close();
} |
Je pense que le problème vient du fait que la mémoire n'est pas libéré quand la méthode insertImage() se termine. Du coup les images en mémoire (dans les variables bytes[] et bytesMini[]) prennent de la place et cette place monte à plus de 500Mo ce qui est pas bon du tout... Au bout d'un moment le script plante disant qu'il manque de mémoire.
Si quelqu'un pouvait jeter un coup d'oeil pour m'expliquer.
J'ai mis en fichiers attachés les 2 classes utiles. Pour la connexion j'utilise le connecteur qu'on peut trouver ici :
http://dev.mysql.com/downloads/connector/j/5.1.html
Merci d'avance.
edit : C'est au fichier 656 que ça fou la merde (c'est pas toujours le même) la mémoire utilisé monte a 474Mo. L'erreur c'est java.lang.OutOfMemoryError : Java heap space à la ligne :
rsImage.updateBytes("imageNormalModel", bytes);
Çà par contre ça change pas je crois (mais pas sûr...) Il est tard pas le temps de retester...
Partager