ne limite pas votre auto avec Integer.MAX_VALUE
bien que cette question a été posée il y a plusieurs années, mais ai voulu participer avec un exemple simple en utilisant uniquement java se sans bibliothèques externes
d'abord, disons qu'il est théoriquement impossible, mais pratiquement possible
un nouveau look: si le tableau est un objet d'éléments que d'avoir un objet qui est un tableau de tableaux
est ici l'exemple
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.List;
/**
*
* @author Anosa
*/
public class BigArray<t>{
private final static int ARRAY_LENGTH = 1000000;
public final long length;
private List<t[]> arrays;
public BigArray(long length, Class<t> glasss)
{
this.length = length;
arrays = new ArrayList<>();
setupInnerArrays(glasss);
}
private void setupInnerArrays(Class<t> glasss)
{
long numberOfArrays = length/ARRAY_LENGTH;
long remender = length % ARRAY_LENGTH;
/*
we can use java 8 lambdas and streams:
LongStream.range(0, numberOfArrays).
forEach(i ->
{
arrays.add((t[]) Array.newInstance(glasss, ARRAY_LENGTH));
});
*/
for (int i = 0; i < numberOfArrays; i++)
{
arrays.add((t[]) Array.newInstance(glasss, ARRAY_LENGTH));
}
if (remender > 0)
{
//the remainer will 100% be less than the [ARRAY_LENGTH which is int ] so
//no worries of casting (:
arrays.add((t[]) Array.newInstance(glasss, (int) remender));
}
}
public void put(t value, long index)
{
if (index >= length || index < 0)
{
throw new IndexOutOfBoundsException("out of the reange of the array, your index must be in this range [0, " + length + "]");
}
int indexOfArray = (int) (index/ARRAY_LENGTH);
int indexInArray = (int) (index - (indexOfArray * ARRAY_LENGTH));
arrays.get(indexOfArray)[indexInArray] = value;
}
public t get(long index)
{
if (index >= length || index < 0)
{
throw new IndexOutOfBoundsException("out of the reange of the array, your index must be in this range [0, " + length + "]");
}
int indexOfArray = (int) (index/ARRAY_LENGTH);
int indexInArray = (int) (index - (indexOfArray * ARRAY_LENGTH));
return arrays.get(indexOfArray)[indexInArray];
}
}
et est ici le test
public static void main(String[] args)
{
long length = 60085147514l;
BigArray<String> array = new BigArray<>(length, String.class);
array.put("peace be upon you", 1);
array.put("yes it worj", 1755);
String text = array.get(1755);
System.out.println(text + " i am a string comming from an array ");
}
ce code est seulement limité par seulement Long.MAX_VALUE
et Java tas mais vous pouvez le dépasser comme vous vouloir (je l'ai fait 3800 Mo)
j'espère que c'est utile et fournir une réponse simple
Juste curieux: Pourquoi avez-vous besoin de garder autant de données en mémoire en même temps? Ne serait-il pas possible de diviser cela en morceaux? –
+1 au commentaire de bruno. La seule façon d'avoir le fichier entier en mémoire sera un avantage si vous avez besoin de faire des accès aléatoires dans différents points du fichier, et dans ce cas vous seriez certainement mieux de l'analyser dans une représentation plus computable. – kdgregory
Je suis va essayer d'utiliser un arbre de préfixe (trie) pour garder les données, cela peut le rétrécir assez pour tenir dans 2 Go de mémoire. –