我正在从网络服务中读取大型csv像这样:
br = new BufferedReader(new InputStreamReader(website.openStream(), "UTF-16"));
我逐行阅读并写入数据库。写入数据库是这个操作的瓶颈,我想知道是否有可能我会用webservice“超时”,所以我得到了webservice只是切断连接的条件,因为我没有从中读取任何东西..
或者BufferedReader只是将流缓冲到内存中,直到我从中读取它为止?
答案 0 :(得分:1)
是的,在您写入数据库时,Web服务流可能会超时。如果db足够慢以至于可能会超时,那么您可能需要在将文件推送到数据库之前在本地复制该文件。
答案 1 :(得分:0)
BufferedReader会将流的内容读入内存。对read
或readLine
的任何调用都将从缓冲区读取数据,而不是从原始流中读取数据,假设数据已在缓冲区中可用。这里的优点是数据以较大批量读取,而不是在每次调用read
或readLine
时从流中请求。
如果您正在阅读大量数据,您可能只会遇到超出描述的超时。我在找到可靠的引用时遇到了一些麻烦但我已经看到几个提到BufferedReader
上的默认缓冲区大小为8192字节(8kb)。这意味着如果您的流正在读取超过8kb的数据,则缓冲区可能会填充并导致您的进程在数据库瓶颈上等待,然后才能从流中读取更多数据。
如果您认为需要保留比此更大的缓冲区,则BufferedReader
构造函数会重载第二个参数,允许您以字节为单位指定缓冲区的大小。但请记住,除非您移动足够小的数据来缓冲整个流,否则即使使用更大的缓冲区也可能遇到同样的问题。
br = new BufferedReader(new InputStreamReader(website.openStream(), "UTF-16"), size);
将使用BufferedReader
字节的缓冲区初始化size
。
编辑:
在阅读@ Keith的评论后,我认为他在这里有权利。如果遇到超时,较小的缓冲区将使您更频繁地从套接字读取,希望消除该问题。如果他发布了答案你就应该接受他的答案。
答案 2 :(得分:0)
+1给Brian的回答。
此外,我建议您查看我的csv-db-tools on GitHub。 csv-db-importer
模块说明了如何将大型CSV文件导入数据库。代码经过优化,可以一次插入一行,并使内存不受大型CSV文件缓冲的数据的影响。
答案 3 :(得分:0)
BufferedReader只是将块读入内部缓冲区,其默认大小未指定,但多年来一直是4096个字符。当你不打电话时,它什么都不做。
但我认为你认为的问题甚至不存在。我看不到网络服务怎么会知道。 TCP中的写入超时很难实现。有些平台有API,但Java不支持它们。
Web服务很可能只是使用阻塞模式套接字,如果你读的速度不够快,它就会阻塞它。