У меня есть файл CSV, который слишком большой, чтобы вписаться в оперативную память, и едва ли только подходит на мой жесткий диск. Мне нужно разделить этот файл CSV на части. > выписать детали. Я понимаю, что это может быть не идеально, но, честно говоря, задача под рукой на самом деле не является точкой. >. Вот мой код. < /P>
import java.nio.file.*;
import java.util.function.*;
import java.util.stream.*;
import java.util.*;
import static java.nio.file.StandardOpenOption.*;
public class temp2
{
public static final Path parentFolder =
Path
.of(".")
.toAbsolutePath()
.normalize()
;
public static void main(final String[] args) throws Exception
{
System.out.println(parentFolder);
for (int i = 0; i < 10; i++)
{
Files.deleteIfExists(parentFolder.resolve(String.valueOf(i)));
}
final int LIMIT = 100_000;
final HashMap blahs =
IntStream
.range(0, 100_000_000)
.parallel()
.mapToObj(String::valueOf)
.collect
(
Collector
.of
(
HashMap::new,
(map, s) ->
{
final String key = String.valueOf(s.charAt(0));
final List list = map.compute(key, (k, v) -> v == null ? new ArrayList() : v);
list.add(s);
if (list.size() > LIMIT)
{
writeThenClearList(key, list);
}
},
(HashMap oldMap, HashMap newMap) ->
{
System.out.println(oldMap.values().stream().flatMap(Collection::stream).count());
System.out.println(newMap.values().stream().flatMap(Collection::stream).count());
System.out.println("---");
oldMap.forEach(temp2::writeThenClearList);
newMap.forEach(temp2::writeThenClearList);
return new HashMap();
},
(map) ->
{
map.forEach(temp2::writeThenClearList);
return map;
}
)
)
;
blahs.entrySet().forEach(System.out::println);
}
private static void writeThenClearList(final String key, final List list)
{
if (list.isEmpty())
{
return;
}
try {
Files
.write(
parentFolder.resolve(key),
list,
StandardOpenOption.CREATE,
StandardOpenOption.WRITE,
StandardOpenOption.APPEND,
StandardOpenOption.SYNC
);
} catch (final Exception e) {
throw new RuntimeException(e);
}
list.clear();
}
}
< /code>
Написание было довольно простым - он просто генерирует все числа от 0 до 100 миллионов, а затем группирует их в файлы на основе начальной цифры. Итак, 0 переходит в файл te 0, 1 заходит в файл 1, 10 заходит в 1 -й файл, 20 заходит в 2 -й файл, 300 заходит в 3 -й файл и т. Д. < /p>
Я также особо заботился о использовании standardopenoption.sync
, чтобы убедиться, что мои записи происходили синхронно. код. Я использовал jshell , но я также получил те же результаты, запустив его как обычный файл.
У меня есть файл CSV, который слишком большой, чтобы вписаться в оперативную память, и едва ли только подходит на мой жесткий диск. Мне нужно разделить этот файл CSV на части. > выписать детали. Я понимаю, что это может быть не идеально, но, честно говоря, задача под рукой на самом деле не является точкой. >. Вот мой код. < /P> [code]import java.nio.file.*; import java.util.function.*; import java.util.stream.*; import java.util.*;
import static java.nio.file.StandardOpenOption.*;
public class temp2 {
public static final Path parentFolder = Path .of(".") .toAbsolutePath() .normalize() ;
public static void main(final String[] args) throws Exception {
} < /code> Написание было довольно простым - он просто генерирует все числа от 0 до 100 миллионов, а затем группирует их в файлы на основе начальной цифры. Итак, 0 переходит в файл te 0, 1 заходит в файл 1, 10 заходит в 1 -й файл, 20 заходит в 2 -й файл, 300 заходит в 3 -й файл и т. Д. < /p> Я также особо заботился о использовании standardopenoption.sync [/code], чтобы убедиться, что мои записи происходили синхронно. код. Я использовал jshell , но я также получил те же результаты, запустив его как обычный файл. [code]IntStream .range(0, 10) .mapToObj(String::valueOf) .map(Path::of) .map ( path -> { try { return Files.lines(path); }
9 < /td> 11110795 < /td> 2930254808993867970 < /td> 0 < /td> td> 263730435940.350620 < /td> 996168394101800 < /td> 996168394101800 < /td> > < /tr> < /tbody> < /table> < /div> Теперь, что немедленно выскочило, было максимальным значением Для каждого столбца. Это слишком высоко. Некоторые из них сообщали о цифрах в четырехлетних. И, кроме того, у каждого было мин 0. И, кроме того, ни один из случаев не одинаково. Они должны быть такими же, верно? < /P> Так хорошо, у нас есть состояние гонки. Однако я не понимаю, почему стандартная топенопнопция.sync [/code] не защитила меня. Разве это не его работа?>