2012-08-16 60 views
1

我有一个程序产生大量的数据,它将逐行写入一个csv文件(随着数据的创建)。如果我能够在Excel中打开csv文件,它将大约有10亿个单元格(75,000 * 14,600)。我每次尝试访问它时都会引发System.OutOfMemoryException异常(或者甚至创建一个这样大小的数组)。如果任何人有任何想法如何可以将数据带入vb.net,所以我可以做一些简单的操作(所有的数据需要立即可用),那么我会尝试你有每个想法。如何在vb.net中处理一个非常大的数组

我已经看过增加使用的RAM的数量,但其他文章/文章说这将在10亿分之前短暂运行。在这里没有任何问题,假设它不超过几天/每周我可以处理它(我只会每年运行一次或两次)。如果你不知道这么做,我能想到的唯一的其他解决方案就是将excel中的列数增加到75,000(如果可能的话 - 不能用其他方式写数据),或者我猜想如果有另一种语言可以处理这个问题?

目前它在一开始失败:

Dim bigmatrix(75000, 14600) As Double 

非常感谢, 弗雷泽:)

+0

为什么你说所有的数据必须一次可用?这里最好的办法就是尽你所能地对这个陈述进行质疑。 :-) – 2012-08-16 05:34:51

+0

Jason,发生什么事是我将数据逐行写入文件。然后我需要数据转置(即列到行等)。没有全部日期,我看不到任何合理的方式。如果你能那样做会很棒! :) – FraserOfSmeg 2012-08-16 17:23:27

+0

如果你只是想转换一个巨大的CSV,我会做的就是从概念上将数组分成1000 x 1,000个大块,即一次读取一千行,计算这个转置,并将每个块写入文件。然后你可以做一个合并通行证,你在这些块中读取(以转置的形式)并流出最终文件。 – 2012-08-16 19:32:01

回答

1

首先,这将始终需要一个64位操作系统和相当大量的RAM,为你正在尝试分配大约8 GB。

如果打开gcAllowVeryLargeObjects,这在理论上可以在Visual Basic中以.NET 4.5为目标。也就是说,如果可能的话,我会推荐使用jagged array而不是多维数组,因为这将消除需要单个8GB分配的需求。 (这也可能允许它在.NET 4或更早版本中工作。)

+0

嘿里德,感谢您的帮助!我在我的VS2010版上试过了一个锯齿状的阵列,但没有运气。所以我正在下载并安装.net4.5 :)我会回来后发布,如果我得到它的工作!再次感谢! – FraserOfSmeg 2012-08-16 08:21:36

+0

@ user1601928你有多少内存?你在什么操作系统上? – 2012-08-16 16:15:42

+0

目前在我的笔记本电脑上运行它:4GB内存,赢7 - 64,英特尔I5 2.3GHz。我将如何实际打开gcAllowVeryLargeObjects?我已经下载了最新的VB,但我不知道如何实际打开它:/任何帮助,将不胜感激:) – FraserOfSmeg 2012-08-16 17:24:47