-
-
Notifications
You must be signed in to change notification settings - Fork 1.1k
open_mfdataset() memory error in v0.10 #1745
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
I think this was introduced by #1551, where we started loading coordinates that are compared for equality into memory. This speeds up We might consider adding an option for reduced memory usage at the price of speed. @crusaderky @jhamman @rabernat any thoughts? |
It sounds weird. Even if all the 20 variables he's dropping were coords on the longest dim, and the code was loading them up into memory and then dropping them (that would be wrong - but I didn't check the code yet to verify if that's the case), then we're talking about... @njweber2 how large are these files? Is it feasible to upload them somewhere? If not, could you write a script that generates equivalent dummy data and reproduce the problem with that? |
|
Only if the coords are tridimensional.. |
Thank you for the responses. Turns out my eyeball estimation of the dropped/kept variables was way off. My The size of one netcdf file (which only contains one time step) is ~335 MB. You can look at one of these files here. It's a hefty dataset overall. |
I'm getting a similar error. The file size is very small (Kbs), so I don't think it's the size issue above. Instead, the error I get is due to something strange happening in core.utils.is_remote_uri(path). The error occurs when I'm reading netcdf3 files with the default netcdf4 engine (which should be able to handle netcdf3 of course). The error message is: The function where the problem arises is:
The function is called a few times during the open_dataset (or open_mfdataset, I get the same error). On the third or fourth call it triggers the error. As I'm not using remote datasets, I can hard-code the output of the function to be
and then the file reads with no problems. The I've output the argument to the I can't see any difference between the arguments to the function on the second and third call. When I copy them, assign them to variables and check equality in python it evaluates to True. I've added in a simpler call to
This also triggers the error on the third call to the function. As such we can rule out something to do with the path name. I've played around with the The error does not occur in xarray 0.9.6. The same function is called in a similar way and the function evaluates to False each time. I'm not really sure what to do next, though. The obvious workaround is to set engine='scipy' if you're working with netcdf3 files. Can anyone replicate this error? |
I've played around with it a bit more. It seems like it's the ^ character in the re.search term that's causing the issue. If this is removed and the function is simply:
then I can load the file. |
@braaannigan Can you share the name of your problematic file? One possibility is that import threading
LOCK = threading.Lock()
def is_remote_uri(path):
with LOCK:
return bool(re.search('^https?\://', path)) |
Hi @shoyer, thanks for getting back to me. That hasn't worked unfortunately. The only difference including the with LOCK statement makes is that the file load seems to work, but then the core dump happens when you try to access the object, e.g. with the
As above, removing the |
There is also some filename dependence. The file load works for g.nc, gr.nc, gri.nc and then fails for grid.nc. The file load also works for grida.nc |
@braaannigan what about replacing |
Hi @shoyer The crash does not occur when the ^ is removed. When I run The file loads with the scipy engine. I get a module import error with h5netcdf, even though
|
If the ^ isn't strictly necessary I'm happy to put together a PR with it removed. |
|
@braaannigan can you try adding |
With print(repr(path)) I get: |
I've also now tried out the re.match approach you suggest above, but it generates the same core dump as the re.search('^...') approach |
I think there is probably a bug buried inside the |
Interesting. I've tried to look at this a bit more by in netCDF4_.py running:
So, all I did was add a print statement In this case the open_dataset call worked fine. |
Can you reproduce this just using netCDF4-python? Try:
If so, it would be good to file a bug upstream. Actually, it looks like this might be Unidata/netcdf4-python#506 |
Hi @shoyer This dependence on 88 characters is consistent with the bug here: |
If upgrating to a newer version of netcdf4-python isn't an option we might need to figure out a workaround for xarray.... It seems that anaconda is still distributing netCDF4 1.2.4, which doesn't help here. |
Hi @shoyer Updating netcdf4 to version 1.3.1 solves the problem. I'm trying to think what the potential solutions are. Essentially, we would need to modify the function ds.filepath(). However, this isn't possible inside xarray. Is there anything we can do other than add a warning message with the recommendation to upgrade netcdf4 when the file path has 88 characters and netcdf4 is version 1.2.4? Should we also submit an issue to anaconda to get the default package updates? Happy to prepare these if you think it's the best way to proceed. Liam |
Both the warning message and the upstream anaconda issue seem like good ideas to me. |
Code Sample
Problem description
I am trying to load 73 model (WRF) output files using
open_mfdataset()
. (Thus, 'Time' is a new dimension). Each netcdf has dimensions{'x' : 405, 'y' : 282, 'z': 37}
and roughly 20 variables (excluding the other ~20 indropvars
).When I run the above code with v0.9.6, it completes in roughly 7 seconds. But with v0.10, it crashes with the following error:
*** Error in `~/anaconda3/bin/python': corrupted size vs. prev_size: 0x0000560e9b6ca7b0 ***
which, as I understand, means I'm exceeding my memory allocation. Any thoughts on what could be the source of this issue?
Output of
xr.show_versions()
xarray: 0.10.0
pandas: 0.20.3
numpy: 1.13.1
scipy: 0.19.1
netCDF4: 1.2.4
h5netcdf: 0.5.0
Nio: None
bottleneck: 1.2.1
cyordereddict: None
dask: 0.16.0
matplotlib: 2.0.2
cartopy: None
seaborn: 0.8.0
setuptools: 27.2.0
pip: 9.0.1
conda: 4.3.29
pytest: 3.1.3
IPython: 6.1.0
sphinx: 1.6.2
The text was updated successfully, but these errors were encountered: