Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
任何可以在CSV文件中来回遍历的Java CSV Api>;1GB_Java_Mysql_Multithreading_Csv - Fatal编程技术网

任何可以在CSV文件中来回遍历的Java CSV Api>;1GB

任何可以在CSV文件中来回遍历的Java CSV Api>;1GB,java,mysql,multithreading,csv,Java,Mysql,Multithreading,Csv,我必须写一个代码来比较两个CSV(排序)。CSV是自动生成的,总是有超过600000行和超过140列。没有必要逐行进行比较。少数单元格将被视为主键,并将与CSV2中的行进行匹配,一旦找到匹配项,将对CSV2中的特定行进行比较。但是对于这一点,我需要一次又一次地迭代CSV2,以便在CSV2中找到匹配的行(因为行可能出现在CSV2的开头或结尾)。这将耗费大量时间 我采取的另一种方法是根据大小分割文件。但是,这种方法还有一个问题,因为文件中的一些行也分成了两行。例如,如果文件被分成两部分,则第320行

我必须写一个代码来比较两个CSV(排序)。CSV是自动生成的,总是有超过600000行和超过140列。没有必要逐行进行比较。少数单元格将被视为主键,并将与CSV2中的行进行匹配,一旦找到匹配项,将对CSV2中的特定行进行比较。但是对于这一点,我需要一次又一次地迭代CSV2,以便在CSV2中找到匹配的行(因为行可能出现在CSV2的开头或结尾)。这将耗费大量时间

我采取的另一种方法是根据大小分割文件。但是,这种方法还有一个问题,因为文件中的一些行也分成了两行。例如,如果文件被分成两部分,则第320行不完整,因为只有一部分存在于文件1中,其余部分存在于文件2中

使用多线程(如果每个线程都在分割文件上工作),有一个问题,因为文件所在磁盘的头必须根据每个线程的要求移动

还尝试使用JDBC(CSVDriver),但由于CSV文件太大而引发OutOfMemoryException


是否有任何方法,我们可以使用任何文件读取器或CSV读取器在CSV中来回移动。例如,使用CSV reader对象,假设这样做:csvReaderObject.get(120)获取我的第120行或csvReaderObject.contains()获取我的匹配行号,类似于这样的情况?

您还可以使用RandomAccessFile类,该类确保数据驻留在磁盘上,并在一个循环中遍历两个文件,以便逐个比较每个文件中的行,或者如果要将文件1中的每一行与文件2中的所有行进行比较,则必须在两个嵌套循环中遍历它们

后者的时间复杂度为O(n^2),而前者的时间复杂度为O(n)

如果要使用多线程,请确保为每个线程创建一个RandomAccessFile实例,因为只有一个游标对象


然后根据行数计算批数,并将每个批分配给另一个线程

如果没有具体的示例,您的问题非常不清楚,但解决方案可能是将CSV文件的内容存储在数据库中并使用查询,除非您有足够的RAM来存储内存中的所有内容。如果输入文件是根据匹配条件排序的,那么您不需要多次读取一个文件,请使用“合并”方法,如许多地方所述。例如,我将文件导入数据库,并使用SQL对它们进行比较。