小编rsu*_*min的帖子

JSON 中非常长的字符串(>1 gig),带有 Jackson 令牌流

我正在尝试编写一些处理 JSON 文档的代码,其中存储在文件中的字符串值非常长(超过 10 亿个字符)。我不想将整个字符串保留在内存中(因为我可以在流中处理它们)。但我在杰克逊解析器中找不到这样的选项。到目前为止,我所做的是使用 Jackson 令牌偏移量(第一轮读取文件)和随机访问文件来处理流中的字符串(第二轮读取文件)的测试:

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.RandomAccessFile;
import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.Map;

import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
import com.fasterxml.jackson.databind.MappingJsonFactory;

public class LongStringJsonTest {
    public static void main(String[] args) throws Exception {
        File tempJson = new File("temp.json");
        PrintWriter pw = new PrintWriter(tempJson);
        pw.print("{\"k1\": {\"k11\": \"");
        for (int i = 0; i < 1e8; i++)
            pw.print("abcdefghij"); 
        pw.print("\"}, \"k2\": \"klmnopqrst\", " +
                "\"k3\": [\"uvwxyz\", \"0123\"]}");
        pw.close();
        searchForStrings(tempJson);
    }

    private static void …
Run Code Online (Sandbox Code Playgroud)

java json out-of-memory token jackson

7
推荐指数
1
解决办法
1762
查看次数

docker容器文件夹中的命名管道通过boot2docker挂载到mac os x文件系统

我正在使用Mac OS X上的boot2docker通过docker image包装一些科学软件.该软件(https://github.com/voutcn/megahit.git)正在使用命名管道(在python代码中,但它并不重要)将不同的部分(用C书写)相互连接起来.我从主机Mac OS X机器挂载临时文件夹,在docker容器中提供临时区域(因为软件的临时输出可能很大),如下所示:

docker run -v /external/folder:/tmp/scratch <image> <args>
Run Code Online (Sandbox Code Playgroud)

它给了我在容器内的这个挂载线:

none on /tmp/scratch type vboxsf (rw,nodev,relatime)
Run Code Online (Sandbox Code Playgroud)

在这个挂载的文件夹中,名为管道创建在容器内运行时失败.它甚至与python,C或任何特定语言无关.我mkfifo pipe1在这个文件夹中用linux命令检查了一次错误:

mkfifo: cannot create fifo 'pipe1': Operation not permitted
Run Code Online (Sandbox Code Playgroud)

它适用于容器内任何内部未安装的文件夹.为什么会发生这种情况又如何解决?

PS:这是我轻松重现问题的方法.

1)带有boot2docker的Mac OS X.

2)Dockerfile是:

FROM ubuntu:14.04
#WORKDIR /tmp <- this one would work
WORKDIR /tmp/scratch
ENTRYPOINT [ "mkfifo" ]
CMD [ "pipe1" ]
Run Code Online (Sandbox Code Playgroud)

3)图像构建:

docker build --rm -t mine/namedpipes:latest .
Run Code Online (Sandbox Code Playgroud)

4)运行(在要安装的外部主机文件夹中):

docker run -v $(pwd):/tmp/scratch mine/namedpipes:latest
Run Code Online (Sandbox Code Playgroud)

macos named-pipes docker boot2docker

7
推荐指数
1
解决办法
1037
查看次数

如何在测试完成后杀死在后台运行的phantomjs进程

在构建服务器上运行phatomjs/java集成测试之后,phantomjs进程仍然在后台运行并且必须手动终止.

有没有办法在java代码中执行此操作?我已经在测试清理部分使用了driver.quit().还有什么还包括在内吗?

java integration-testing phantomjs

5
推荐指数
2
解决办法
6717
查看次数

杰克逊中的通用元组反序列化

碰巧我需要支持来自外部数据源的Java JSON数据.有一种常见的模式.它是一个包含固定数量的某些不同类型元素的数组.我们称之为元组.这是我使用FasterXML Jackson对3元素元组进行反序列化的示例,其中包含特定的预期元素类型:

public class TupleTest {
    public static void main(String[] args) throws Exception {
        String person = "{\"name\":\"qqq\",\"age\":35,\"address\":\"nowhere\",\"phone\":\"(555)555-5555\",\"email\":\"super@server.com\"}";
        String jsonText = "[[" + person + ",[" + person + "," + person + "],{\"index1\":" + person + ",\"index2\":" + person + "}]]";
        ObjectMapper om = new ObjectMapper().registerModule(new TupleModule());
        List<FixedTuple3> data = om.readValue(jsonText, new TypeReference<List<FixedTuple3>>() {});
        System.out.println("Deserialization result: " + data);
        System.out.println("Serialization result: " + om.writeValueAsString(data));
    }
}
Run Code Online (Sandbox Code Playgroud)
class Person {
    public String name;
    public Integer age;
    public String address; …
Run Code Online (Sandbox Code Playgroud)

java generics json jackson deserialization

2
推荐指数
1
解决办法
2410
查看次数